1. 在腾讯开放平台创建应用,申请Appkey
腾讯开放平台地址:http://open.qq.com/
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登录初始化
Tencent mTencent = 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);
*增量授权的代码
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();
}