admin管理员组

文章数量:1530284

</pre>一些基础性的东西我就不说了,至于怎么去下载SDK,什么的相信都知道<p></p><p>QQ </p><p>1.第三方登录:</p><p>首先在需要第三方登录的地方声明</p><p></p><pre name="code" class="java"> /**
     * QQ第三方登录
     *
     * @param savedInstanceState
     */
    private static Tencent mTencent; // qq主操作对象
    private String scope; // 获取信息的范围参数
    private UserInfo userInfo; // qq用户信息
    private String openid = "";
然后再Oncreate()方法中添加如下
<pre name="code" class="java"> /**
         * QQ第三方登录
         */
        mTencent = Tencent.createInstance(YbgConstant.APP_ID, LoginActivity.this);
        scope = "all";


 给到点击事件,在Onclick()方法中添加 

case R.id.QQLogin_img:
            // 试用QQ第三方登录
            qqLogin();
方法qqLogin()的具体

// 第三方登陆QQ
    public void qqLogin() {
        // 如果sesson有效
        if (!mTencent.isSessionValid()) {
            // 开始qq授权登录
            mTencent.login(LoginActivity.this, "all", loginListener);
        }
    }
loginListener是用来实现接口回调的,必须是IUiListener
<pre name="code" class="java">IUiListener loginListener = new IUiListener() {
        @Override
        public void onError(UiError arg0) {
            T.showShort(LoginActivity.this, "登陆失败,请稍后重试!");
        }

        @Override
        public void onComplete(Object value) {
            if (value == null) {
                return;
            }
            // value
            initOpenidAndToken((JSONObject) value);
            System.out.println("有数据返回..");
            // 获取用户信息
            getUserInfo();

            try {
                JSONObject jo = (JSONObject) value;
                T.showShort(getContext(), jo.toString());
                System.out.println("json=" + String.valueOf(jo));
                openid = jo.getString("openid");
//                thirdlogin("QQ");
                //初始背景
                startCustomLoading(LoginActivity.this);
                String accessToken = jo.getString("access_token");
                String expires = jo.getString("expires_in");
                mTencent.setOpenId(openid);
                mTencent.setAccessToken(accessToken, expires);

            } catch (Exception e) {
                T.showShort(LoginActivity.this, "exception1");
            }
        }

        @Override
        public void onCancel() {
            T.showShort(LoginActivity.this, "取消登录!");
        }
    };

 其中   
//                thirdlogin("QQ");
是第三方登录的具体操作,获取到的json中有openid(这个是关键)

2.分享

首先是声明

 private Tencent mTencent;
    private String mAppId;
然后再oncreate()方法中添加如下

 mTencent = Tencent.createInstance(mAppId, getApplicationContext());
点击分享之后就有如下

case R.id.btnqqfriend:
            // 分享给QQ好友或群
            params = new Bundle();
            params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
            params.putString(QQShare.SHARE_TO_QQ_TITLE, "要分享的标题");
            params.putString(QQShare.SHARE_TO_QQ_SUMMARY, "要分享的摘要");
            params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, "http://www.qq/news/1.html");
            params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, "http://imgcache.qq/qzone/space_item/pre/0/66768.gif");
            params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "测试应用222222");
            // params.putInt(QQShare.SHARE_TO_QQ_EXT_INT,
            // Integer.parseInt("其他附加功能"));
            mTencent.shareToQQ(this, params, new BaseUiListener());
            break;
并且需要实现BaseUiListener()回调

其实这里并没有写什么东西,只是如果需要回调之后的操作,可以在这里添加响应代码

/**
     * QQ分享
     */
    private class BaseUiListener implements IUiListener {
        protected void doComplete(JSONObject values) {
        }

        @Override
        public void onComplete(Object o) {
            doComplete((JSONObject) o);
        }

        @Override
        public void onError(UiError e) {
        }

        @Override
        public void onCancel() {
        }
    }
这样可以分享到QQ空间,QQ好友

微信

1.第三方登录

这里的第三方登录,是在手机APP端的,并不是公众号

首先也是需要先声明的

/**
     * 微信第三方登录
     *
     * @param savedInstanceState
     */
    private IWXAPI mWeiXinApi;
    private String WEIXIN_SCOPE = "snsapi_userinfo";
    private String WEIXIN_STATE = "10000";
    private String weixinCode;
    private static String get_access_token = "";
    // 获取第一步的code后,请求以下链接获取access_token
    public static String GetCodeRequest = "https://api.weixin.qq/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    // 获取用户个人信息
    public static String GetUserInfo = "https://api.weixin.qq/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
这里的两个URL可以先不写,因为我们需要在第一次请求之后再次请求,第二次请求的时候需要根据第一次的返回值,拼写URL

然后第三方登录的点击事件

case R.id.WeiXinLogin_img:
            // 使用微信第三方登录
            WXlogin();
            v.startAnimation(shake);
            break;
这里是WXLogin()方法的实现

/**
     * 第三方微信登陆
     */
    public void WXlogin() {
        mWeiXinApi = WXAPIFactory.createWXAPI(this, com.yibugou.ybg_app.views.payment.wechatpayment.Constants.APP_ID,
                true);
        if (!mWeiXinApi.isWXAppInstalled()) {
            T.showShort(LoginActivity.this, "请先安装微信");
            return;
        }
        mWeiXinApi.registerApp(com.yibugou.ybg_app.views.payment.wechatpayment.Constants.APP_ID);
        SendAuth.Req req = new SendAuth.Req();
        req.scope = WEIXIN_SCOPE;
        req.state = WEIXIN_STATE;
        mWeiXinApi.sendReq(req);
    }
这样,在首个页面的代码就完成了,这里的最后一句代码是请求回调的,我们在发送一个请求之后,就会调起授权页面,授权成功之后,需要有接受回调的地方,那么就需要在申请SDK的包名下面再新建一个名字是wxapi的文件夹,并且在该文件加下面新建WXENtryActivity.java文件,目录结构如下

然后再该类里面实现IWXAPIEventHandler接口,然后需要重写

 @Override
    public void onReq(BaseReq baseReq) {
    }

    @Override
    public void onResp(BaseResp resp) {
}
这两个方法

这个类的具体代码如下:

import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.igexin.sdk.PushManager;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.modelmsg.SendAuth;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.WXAPIFactory;

import java.util.HashMap;
import java.util.Map;

import de.greenrobot.event.EventBus;

/**
 * Created by xiaoniu on 2015/12/1. 描述:微信第三方登录的时候的回调在此处完成
 */
public class WXEntryActivity extends BaseActivity implements IWXAPIEventHandler {

    private IWXAPI api;
    public static BaseResp resp;
    public String code = "";
    String openid = "";

    // url 获取token的url
    public String UrlTokenString;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 注册API
        api = WXAPIFactory.createWXAPI(this, com.yibugou.ybg_app.views.payment.wechatpayment.Constants.APP_ID);
        api.handleIntent(getIntent(), this);
    }

    @Override
    public void onReq(BaseReq baseReq) {
    }

    @Override
    public void onResp(BaseResp resp) {
        T.showShort(this, "onResp:" + resp.toString());
        T.showShort(this, "code" + ((SendAuth.Resp) resp).code);
        code = ((SendAuth.Resp) resp).code;
        String result = "";
        if (resp != null) {
            this.resp = resp;
        }
        // 根据resp获取到
        switch (resp.errCode) {
        case BaseResp.ErrCode.ERR_OK:
            finish();
            startCustomLoading(this);
            // 拼写URL获取openid
            UrlTokenString = "https://api.weixin.qq/sns/oauth2/access_token?appid="
                    + Constants.APP_ID + "&secret="
                    + Constants.API_SCEPE + "&code=" + code
                    + "&grant_type=authorization_code";
            WXGetUserInfo(UrlTokenString);
            break;
        case BaseResp.ErrCode.ERR_USER_CANCEL:
            result = "发送取消";
            Toast.makeText(this, result, Toast.LENGTH_LONG).show();
            finish();
            break;
        case BaseResp.ErrCode.ERR_AUTH_DENIED:
            result = "发送被拒绝";
            Toast.makeText(this, result, Toast.LENGTH_LONG).show();
            finish();
            break;
        default:
            result = "发送返回";
            Toast.makeText(this, result, Toast.LENGTH_LONG).show();
            finish();
            break;
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    /**
     * 根据URL获取微信用户个人信息
     *
     * @param get_user_info_url
     *            调用URL
     */
    private void WXGetUserInfo(String get_user_info_url) {

        new BaseModel(new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                // 获取openid
                openid = JSONUtils.getString(response, "openid", null);
                // T.showShort(WXEntryActivity.this,"openid = "+openid);
                thirdlogin("WX", openid);
            }

        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if (error != null) {
                    T.showShort(mContext, "网络异常,请检查是否有网络连接");
                    disCustomLoading();
                }
            }
        }, get_user_info_url, null);
    }

    /**
     * 第三方登录具体方法实现
     * 
     * @param openidtype
     * @param openid
     */
    public void thirdlogin(final String openidtype, final String openid) {
        
    }

}
这里首先从返回的信息里面获取得到code值,然后通过拼写URL获取得到openid,这里也就可以得到授权用户的一些信息,包括用户名,性别,地址等等

2.微信分享

这个比较简单,我们可以直接访问,而不使用回调,这个也是可以的(不过可能会有一些问题,如果返回的时候没有找到,可能就会有点不好看,这里只是一个demo)

 private IWXAPI api;
在Oncreate()方法中,
api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);
        api.registerApp(Constants.APP_ID);
然后再onclick()方法中直接吧所有的代码都完成


其中webpageUrl是链接的地址

title是标题

description是描述,

setThumbImage是一个自定义的图片


但是依然存在问题,在完成操作之后并没有直接回到我们想要的页面,而且会有闪屏的现象

这里在最后要在声明一下,如果在程序中一次性集成了微信的第三方登陆和微信分享,那么这两个功能会同时找到WXEntryActivity进行回调的,这个时候我们就需要进行一些必要的判断。

从官方的文档中我们可以发现在发送的时候有个state的变量是根据用户自己的定义而决定的,当请求发出去之后,会把这个state值在返还回来,可是我通过看jar包中的源码发现在BaseResp中并没有我们所需要的state变量,它在定义的时候是这样子的



所以只能另辟蹊径,注意,我当时的时间是2016年1月14日 19:14:46,以后如果官方有更新,就要适当的变化,根据具体的内容进行修改

现在既然没有state值返回,只能再去看看别的内容,在尝试中我发现getType()的值时发生变化的,就是说分享和第三方登陆返回的值是不同的


所以在样的情况下我在WXEntryActivity中做了如下判断

@Override
    public void onResp(BaseResp resp) {
//       T.showLong(mContext,"getType"+ resp.getType()+"transaction="+resp.transaction+"errStr"+resp.errStr);
        String result = "";
        if (resp != null) {
            this.resp = resp;
        }
        // 根据resp获取到
        switch (resp.errCode) {
        case BaseResp.ErrCode.ERR_OK:

            if(resp.getType() == 2){
                T.showLong(mContext,"分享成功");
                finish();
            }else if(resp.getType() == 1){
                code = ((SendAuth.Resp) resp).code;
                startCustomLoading(this);
                // 拼写URL获取openid
                UrlTokenString = "https://api.weixin.qq/sns/oauth2/access_token?appid="
                        + com.yibugou.ybg_app.views.payment.wechatpayment.Constants.APP_ID + "&secret="
                        + com.yibugou.ybg_app.views.payment.wechatpayment.Constants.API_SCEPE + "&code=" + code
                        + "&grant_type=authorization_code";
                WXGetUserInfo(UrlTokenString);
            }
            break;
这样就可以解决在回调之后的闪屏问题







本文标签: 第三方qq