Android第三方登录之QQ登录

1. 在腾讯开放平台创建应用,申请Appkey 腾讯开放平台地址:http://open.qq.com/
Android第三方登录之QQ登录
文章图片
qqdenglu.PNG 2. 下载sdk ,导入jar包 下载地址:
http://wiki.connect.qq.com/sdk%e4%b8%8b%e8%bd%bd
Android_SDK使用说明:
http://wiki.connect.qq.com/android_sdk%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E
3.配置AndroidManifest


”你的AppId”则要替换成具体应用的AppId,例如你的AppId是”123456″,则标签应该是这样的:

4. 初始化Tencent类的示例 在onCreate方法中初始化
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //沉浸式状态栏 ImmersiveStateUtil.setImmersiveState(this, R.color.tomato); setContentView(R.layout.activity_login); ButterKnife.bind(this); //QQ登录初始化 TencentmTencent = Tencent.createInstance(ContentUtils.QQ_APP_ID, this.getApplicationContext()); //注册微信登录 wxApi = WXAPIFactory.createWXAPI(this, ContentUtils.WEIXIN_APP_ID, true); wxApi.registerApp(ContentUtils.WEIXIN_APP_ID); //初始化控件 initView(); }

5. 实现QQ登录的回调
public class QQCallback implements IUiListener { @Override public void onComplete(Object o) {QQLoginInfo qqLoginInfo = new Gson().fromJson(String.valueOf(o), QQLoginInfo.class); mTencent.setOpenId(qqLoginInfo.getOpenid()); mTencent.setAccessToken(qqLoginInfo.getAccess_token(), qqLoginInfo.getExpires_in()); getQQUserInfo(qqLoginInfo.getOpenid()); }@Override public void onError(UiError uiError) {}@Override public void onCancel() {}

6. 调用login方法登录
mTencent.login(this, "get_user_info", qqCallback);

7.重点 不加没有回调内容
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // 官方文档没没没没没没没没没没没这句代码, 但是很很很很很很重要, 不然不会回调! mTencent.onActivityResultData(requestCode, resultCode, data, qqCallback); mTencent.handleResultData(data, qqCallback); //if(requestCode == Constants.REQUEST_API) { //if(resultCode == Constants.RESULT_LOGIN) { //mTencent.handleLoginData(data, loginListener); //} //} }

8. 获取用户信息
/** * 获取QQ用户信息 * * @param openid */ public void getQQUserInfo(final String openid) { userInfo = new UserInfo(LoginActivity.this, mTencent.getQQToken()); userInfo.getUserInfo(new IUiListener() { @Override public void onComplete(Object o) { QQUserInfo qqUserInfo = new Gson().fromJson(String.valueOf(o), QQUserInfo.class); 自己写登录的逻辑 }@Override public void onError(UiError uiError) {}@Override public void onCancel() {} }); }

非常重要的一点 刚开始的时候获取token openID都很顺利,但是最后最后一步获取用户信息怎么着都不行,每次都是
{"ret":100030,"msg":"this api without user authorization"} 看QQ登录说明文档是没有获取授权,但是也没有说去那里获取
在网上找了半天 ,才发现了授权的方法 加上就OK了
或者在 mTencent.login(this, "get_user_info", qqCallback); 这个方法中不要仅仅获取get_user_info,不然会获取信息不成功需要增量授权 ,所以最好是填all 比如 mTencent.login(this, "all", qqCallback);
【Android第三方登录之QQ登录】*增量授权的代码
try { JSONObject jsonObject = (JSONObject) obj; int ret = jsonObject.getInt("ret"); if (ret == 100030) { //缺少权限,需要增量授权 Runnable r = new Runnable() { @Override public void run() { mTencent.reAuth(LoginActivity.this, "get_user_info", new IUiListener() { @Override public void onComplete(Object o) { //KKKKK.print(o); }@Override public void onError(UiError uiError) { }@Override public void onCancel() { } }); } }; LoginActivity.this.runOnUiThread(r); } else { QQUserInfo qqUserInfo = new Gson().fromJson(String.valueOf(obj), QQUserInfo.class); otherLogin(ContentUtils.QQ_LOGIN, openid, qqUserInfo.getNickname(), qqUserInfo.getCity(), qqUserInfo.getFigureurl_qq_2(), qqUserInfo.getGender() == "男" ? "1" : "0"); Log.d("zdbb tencent", "用户信息 " + jsonObject); } } catch (JSONException e) { e.printStackTrace(); }

    推荐阅读