Android应用实现QQ登录

来源:互联网 发布:单身潮 知乎 编辑:程序博客网 时间:2024/04/29 05:11

QQ登录总结

1权限和activity配置直接从官方文档拷贝到manifest文件

 <activity            android:name="com.tencent.tauth.AuthActivity"            android:noHistory="true"            android:launchMode="singleTask" >            <intent-filter>                <action android:name="android.intent.action.VIEW" />                <category android:name="android.intent.category.DEFAULT" />                <category android:name="android.intent.category.BROWSABLE" />                <data android:scheme="tencent1106103067" />            </intent-filter>        </activity>
<data android:scheme="tencent1106103067" />
这一行要自己修改,tencent后添加自己的appid。
2 初始化对象和实现回调接口,放在activity的oncreate()方法就行。三个IUiListener对象,分别是登录成功回调、获取用户信息回调和分享成功回调。
private void initQQLogeIn() {        mTencent = Tencent.createInstance(QQ_APPID, MyWebView.this.getApplication());        scope = "all";        {            mTencent = Tencent.createInstance(QQ_APPID, MyWebView.this.getApplication());            scope = "all";            loginListener = new IUiListener() {                @Override                public void onError(UiError arg0) {                }                @Override                public void onComplete(Object value) {                    if (value == null) {                        return;                    }                    try {                        JSONObject jo = (JSONObject) value;                        int ret = jo.getInt("ret");                        System.out.println("json=" + String.valueOf(jo));                        if (ret == 0) {                            String openID = jo.getString("openid");                            id=openID;                            String accessToken = jo.getString("access_token");                            String expires = jo.getString("expires_in");                            mTencent.setOpenId(openID);                            mTencent.setAccessToken(accessToken, expires);                            userInfo=new UserInfo(MyWebView.this.getApplicationContext(), mTencent.getQQToken());                            userInfo.getUserInfo(userInfoListener);                        }                    } catch (Exception e) {                    }                }                @Override                public void onCancel() {                }            };            userInfoListener = new IUiListener() {                @Override                public void onError(UiError arg0) {                    Message msg=new Message();                    msg.what=222;                    msg.obj=fail;                    handler.sendMessage(msg);                }                @Override                public void onComplete(Object arg0) {                    if(arg0 == null){                        return;                    }                    try {                        JSONObject jo = (JSONObject) arg0;                        Message msg=new Message();                        msg.what=222;                        String nickName = jo.getString("nickname");                        String gender = jo.getString("gender");                        String city=jo.getString("city");                        String province=jo.getString("province");                        String result=id+"/"+nickName+"/"+gender+"/"+city+"/"+province;                        msg.obj=result;                        handler.sendMessage(msg);                    } catch (Exception e) {                    }                }                @Override                public void onCancel() {                }            };            shareListener=new IUiListener() {                @Override                public void onComplete(Object o) {                    Log.e("test", "onComplete: "+o.toString() );                }                @Override                public void onError(UiError uiError) {                    Log.e("test", "onError: "+uiError.toString() );                }                @Override                public void onCancel() {                    Log.e("test", "onCancel: ");                }            };        }    }
3 实现登录逻辑
private void QQLogoIn() {        isHasQQ=TaxUtil.isQQClientAvailable(MyWebView.this);//判断是否有客户端        if (isHasQQ){            if (!mTencent.isSessionValid()) {                mTencent.login(MyWebView.this, scope, loginListener);            }        }else {            Toast.makeText(MyWebView.this,"请先安装QQ客户端",Toast.LENGTH_SHORT).show();            return;        }    }
4重写onActivityResult()方法
protected void onActivityResult(int requestCode, int resultCode, Intent data) {        Tencent.onActivityResultData(requestCode,resultCode,data,loginListener);        if (requestCode == Constants.REQUEST_API) {            Tencent.handleResultData(data, loginListener);        }        if (resultCode == Constants.REQUEST_QQ_SHARE || resultCode == Constants.REQUEST_QZONE_SHARE || resultCode == Constants.REQUEST_OLD_SHARE) {            Tencent.handleResultData(data, shareListener);            }        super.onActivityResult(requestCode, resultCode, data);    }

注意了!
Tencent.onActivityResultData(requestCode,resultCode,data,loginListener);
必须加上这一行代码,官方文档上没有,如果不加回调失败。这是最大的坑