花了一天的时间,总算把APP里QQ直接登陆的功能够搞定了,不得不说QQ的官方文档就是个坑,首先是有多个版本和网址都有开发文档,然后要么写的残缺不全,要么是根本不知道在写些什么,真正靠谱的还是论坛和网上分享的博客文章。
我们一步步来分析好了。
第一步,注册开发者账号,点击下面的链接可以看官方文档,这一步官方文档还是靠谱的,成功后得到 你开发的APP所对应的APP_ID和APP_KEY
第二步:创建并配置工程,文档里用的是eclipse,Android Studio的
步骤也差不多,有一个区别是:Studio里手动添加库是把 mta-sdk-1.6.2 和open_sdk_r5043 手动放到libs文件夹下然后右击 “Add Ad Library”
http://wiki.open.qq.com/wiki/%E5%88%9B%E5%BB%BA%E5%B9%B6%E9%85%8D%E7%BD%AE%E5%B7%A5%E7%A8%8B
第三步:创建实例并实现回调,这步也按照官方文档说的走
第四步:QQ登录得到openID(与QQ号唯一对应)、AccessToken(获取用户信息、上传图片等功能时的凭据),这里我的代码里是把openID、AccessToken、expires_in都用SharePreference存了起来
http://wiki.open.qq.com/wiki/QQ%E7%99%BB%E5%BD%95%E5%92%8C%E6%B3%A8%E9%94%80
private static final String SCOPE = "all";
private void loginFromQQ() {
/* 回调了doComplete方法,在其中存储信息 */
IUiListener loginListener = new BaseUiListener() {
@Override
protected void doComplete(JSONObject values) {
try {
String openId = values.getString("openid");
String accessToken = values.getString("access_token");
String expires = values.getString("expires_in");
mTencent.setOpenId(openId);
mTencent.setAccessToken(accessToken, expires);
Long expires_in = values.getLong("expires_in") *1000 + System.currentTimeMillis();
SharedPreferences sp = getSharedPreferences(Config.USER_STATUS,MODE_PRIVATE);
sp.edit().putString(Config.USER_OPEN_ID,openId)
.putString(Config.USER_ACCESS_TOKEN,accessToken)
.putLong(Config.USER_EXPIRES_IN,expires_in).apply();
getUserInfo();
} catch (JSONException e) {
e.printStackTrace();
}
}
};
/* 开始QQ登陆,SCOPE为一个字符串常量 all ,表示你要获取那些信息 */
mTencent.login(this, SCOPE, loginListener);
}
第五步:获取用户信息,在这里官方文档就开始扯淡了,讲得不清不楚的
根本就找不到 Constants.GRAPH_SIMPLE_USER_INFO 这个常量!我猜测是上一个版本里有的,而我用了最新的SDK,结果就找不到了········好在有Google,一番搜索后找到了实现方法
private void getUserInfo()
{
/* 获取用户信息前需要添加 AccessToken */
```java
UserInfo userInfo = new UserInfo(AtyLogin.this, mTencent.getQQToken());
```
IUiListener userInfoListener = new BaseUiListener(){
@Override
protected void doComplete(JSONObject values) {
try {
SharedPreferences sp = getSharedPreferences(Config.USER_STATUS, MODE_PRIVATE);
String openId = sp.getString(Config.USER_OPEN_ID, null);
String nickName = values.getString("nickname");
boolean gender = (values.getString("gender").equals("男"));
String avatar = values.getString("figureurl_2");
String avatar50 = values.getString("figureurl_1");
JSONObject userLoginJSON = new JSONObject();
userLoginJSON.put("idQQ", openId)
.put("name", nickName)
.put("gender", gender)
.put("avatar", avatar)
.put("avatar50", avatar50);
url = "/user/login/qq";
/* 自己写的方法,目的是存储用户信息并登陆 */
storageUserInfoAndLogin(url, userLoginJSON.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
};
userInfo.getUserInfo(userInfoListener);
}
大功告成!