Android应用使用QQ进行第三方登录的一些问题

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-31 21:58   21   0

一、导入jar包,使用QQ开发者平台的SDKs,注意要导入两个包

compile files('libs/open_sdk_r5756.jar')
compile files('libs/mta-sdk-1.6.2.jar')
二、使用登录的API
//实例化mTencent
mTencent=Tencent.createInstance(QQLOGIN_APPID,this.getApplicationContext());
//登录,第二个参数为实现IUiListener接口
mTencent.login(this,QQ_SCOPE,loginListener);
//监听实现
loginListener=new IUiListener() {
            @Override
            public void onComplete(Object o) {
                if(o==null){
                    Toast.makeText(getApplicationContext(),"返回结果为空",Toast.LENGTH_LONG).show();
                    return;
                }
                //objResp= {"ret":0,"openid":"E783DBFBE70A0C83560F2153933AA7BE","access_token":"6D0416C27ED96E5570B1AEEA1250CEF5","pay_token":"308D2AB68D052081832B4AFEB07F86D1","expires_in":7776000,"pf":"desktop_m_qq-10000144-android-2002-","pfkey":"f05741cf1cad3a97be1fc337f3ff1913","msg":"","login_cost":525,"query_authority_cost":335,"authority_cost":0}
                JSONObject jo= (JSONObject) o;
                if(null!=jo&&jo.length()==0){
                    Toast.makeText(getApplicationContext(),"返回结果为空",Toast.LENGTH_LONG).show();
                }
                Toast.makeText(getApplicationContext(),"登录成功",Toast.LENGTH_LONG).show();
                //处理结果
                System.out.println(jo.toString());
                try {
                    int ret=jo.getInt("ret");
                    if(ret==0){
                        Toast.makeText(MainActivity.this, "登录成功",
                                Toast.LENGTH_LONG).show();
                        String openID = jo.getString("openid");
                        String accessToken = jo.getString("access_token");
                        String expires = jo.getString("expires_in");
   //下面两个方法非常重要,否则会出现client request's parameters are invalid, invalid openid
                        mTencent.setOpenId(openID);
                        mTencent.setAccessToken(accessToken, expires);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
//                handleQQLoginReceivedData(jsonvalues);

            }

            @Override
            public void onError(UiError uiError) {
                Toast.makeText(getApplicationContext(),"登录错误",Toast.LENGTH_LONG).show();
            }

            @Override
            public void onCancel() {
                Toast.makeText(getApplicationContext(),"登录取消",Toast.LENGTH_LONG).show();

            }
        };
三、OpenId和Access_Token的区别
    OpenId:QQ和人人、微博社交正好登陆稍有区别,是在授权后并不返回用户uid,取而代之是返回openid,用于标示用户身份。
    Access_Token:通过openid,access_token,appid来读取接口信息,比如get_user_info等等。
四、用户(比如Android客户端)再此访问QQ服务器获取用户信息
   使用的api为:
QQToken qqToken=mTencent.getQQToken();
UserInfo userInfo=new UserInfo(this,qqToken);
userInfo.getUserInfo(new IUiListener() {//异步方式获取用户信息
    @Override
    public void onComplete(Object o) {
        JSONObject Jobj= (JSONObject) o;
        try {

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onError(UiError uiError) {
        System.out.print(uiError.toString());
    }

    @Override
    public void onCancel() {
        System.out.print("cancel");
    }
});
   这个api在底层使用get请求的方式,自己写也可以,根据OpenAPI即可(因为QQ服务器使用php开发,底层接收get方法请求,因此如果自己根据OpenAPI写post请求方式,会导致返回的数据失效),
比如出现错误(client request's parameters are invalid)。
五、几个注意的点
   1.创建应用要在腾讯开放平台,不需要上线,尽量不要在QQ互联开放平台(因为目前QQ互联正往腾讯开放平台搬迁);
   2.在AndroidManifest.xml中要添加文档中需要的两个activity,并且修改APPID为自己的
   3.要使用OnActivityResult的方式获取响应数据(因为很多低端手机是无法直接获取登录的回调函数的),然后在onActivityResult中调用如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //由于在一些低端机器上,因为内存原因,无法返回到回调onComplete里面,是以onActivityResult的方式返回
    if(requestCode==11101&&resultCode==RESULT_OK){
        //处理返回的数据
        if(data==null){
            Toast.makeText(getApplicationContext(),"返回数据为空",Toast.LENGTH_LONG);
        }else{
            Tencent.handleResultData(data,loginListener);
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP