现在很多应用都已经涉及到 第三方登录了,他的使用能更方便大家进入app,不用繁琐的输入密码,那么今天就来探索下 QQ 的三方登录。
首先,大家在白度上 搜 “腾讯开放平台”,进入以下界面:
在 ‘’联系我们‘ 的旁边有登录的,将你的qq开发者账号登上,然后进入 资料库 标签,api文档,下面有 sdk 下载,然后下载最新的官方文档,我是下的 sdk_V_3.1.0,当然,你的
app也是要创建的,在开发者应用管理里面会有你的 app_id 和 app_key
这一切搞定之后就是配置了,我觉得 qq的官方文档真是够烂啊,官方文档,下的demo以及demo中的文档介绍,都不配套。搞起来甚是郁闷啊。好吧,接下来讲配置
解压 sdk 解压后是这样的:
里面有两个jar 包,mta-sdk-1.6.2.jar 和 open_sdk_r5756.jar,都导入到你的工程中。
接下来配置 MainActivityfast.xml
MainActivityfast 中需要原封不动的加入两个 activity,com.tencent.tauth.AuthActivity 和 com.tencent.connect.common.AssistActivity,代码如下:
<application
android:name="com.example.androidtexta.BaseApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden|screenSize|navigation"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true" >
<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="tencent2222222" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="behind"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
</application>
注意:首先com.tencent.tauth.AuthActivity 和 com.tencent.connect.common.AssistActivity的添加包路径是固定的,在 AuthActivity 下面有一个
<data android:scheme="tencent2222222" />
不能忘掉,其中 scheme="xxxxxxx" 中 tencent 是固定的,22222 为你的 app_id,记住是 app_id 不是app_key !上面两个 类只需要按我那样复制进去,改改 app_id就行
当然,不能忘了网络权限,由于我只做登陆,暂时只用到了两个权限,大家这个可以参考官方文档,根据需要添加 我的权限是
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
一切就绪,现在我们要开始进入正题了,此处只做一个简单的点击 登陆 button,获得 个人信息的昵称和 图像,以及登陆成功后获得的登陆基本信息
Ok,下面接着说
首先当然是 qq 登陆的注册,代码如下
private Tencent mTencent;
private String mAppId;
private UserInfo mUserInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("","=====create====");
setConfig();
initView();
initData();
setListener();
}
private void setConfig() {
mAppId ="2222222";
// 注册QQ
mTencent=Tencent.createInstance(mAppId, MainActivity.this);
}
我们在 oncreate 中 对 mTencent 进行初始化,此时需要用到 app_id。
然后是 button 点击时的 登陆方法:
private void setListener() {
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//登陆
mTencent.login(MainActivity.this, "all", new QQListener());
}
});
}
登陆方法 是 mTencent.login(MainActivity.this, "all", new QQListener()); 其中三个参数:第一个是 上下文,第二个是 权限,此处是 “all”,表示所有权限,第三个参数是 登陆的回调,我们登陆的结果是在这个类中处理的,QQListener 是自己写的实现 IUiListener 的 一个类
ok,再看看 QQListener 类的实现
/**获得登陆的基本信息**/
class QQListener implements IUiListener{
//登陆成功
@Override
public void onComplete(Object obj) {
Log.i("","======登陆成功======="+obj.toString());
QQLoadInfo qQLoadInfo=JsonParserUtil.getQQLoadInfo(obj.toString());
//设置openid和token,否则获取不到下面的信息
String openId=qQLoadInfo.getOpenid();
String token = qQLoadInfo.getAccess_token();
String expires = qQLoadInfo.getExpires_in();
mTencent.setAccessToken(token, expires);
mTencent.setOpenId(openId);
mUserInfo=new UserInfo(MainActivity.this, mTencent.getQQToken());
mUserInfo.getUserInfo(new UserInfoListener());
}
//登陆取消
@Override
public void onCancel() {
// TODO Auto-generated method stub
}
//登陆失败
@Override
public void onError(UiError arg0) {
// TODO Auto-generated method stub
}
}
QQListener 实现 IUiListener 时有三个方法,如上,故名思议,分别是 登陆成功,取消和失败。现在主要来看看 成功后的处理,即 onComplete(Object obj) 方法
Log.i("","======登陆成功======="+obj.toString()); 返回的数据大概是这样的:
{
"ret": 0,
"pay_token": "xxxxxxxxx",
"pf": "xxxxxxxxxxxxx",
"query_authority_cost": xxx,
"authority_cost": x,
"openid": "xxxxxxxxxxxx",
"expires_in": xxxxxxxxxx,
"pfkey": "xxxxxxxxxxxx",
"msg": "",
"access_token": "xxxxxxxxx",
"login_cost": xxx
}
这里需要强调一点,在某些低端机上调用登录后,由于内存紧张导致 APP 被系统回收,登录成功后无法在 onComplete(Object obj) 方法中获得登陆信息,这时需要重写 activity的 onActivityResult 方法,如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//在某些低端机上调用登录后,由于内存紧张导致 APP 被系统回收,登录成功后无法成功回传数据,需要重写onActivityResult
if (requestCode == Constants.REQUEST_LOGIN) {
Tencent.onActivityResultData(requestCode,resultCode,data,new QQListener());
}
super.onActivityResult(requestCode, resultCode, data);
}
这样处理以后,你的 QQListener 方法中就可以 获得 登陆后的信息了,OK,下面继续讲 QQListener 类。
如 图像的 url ,性别,省份,昵称等。那么下边这段代码很关键:
QQLoadInfo qQLoadInfo=JsonParserUtil.getQQLoadInfo(obj.toString());
//设置openid和token,否则获取不到下面的信息
String openId=qQLoadInfo.getOpenid();
String token = qQLoadInfo.getAccess_token();
String expires = qQLoadInfo.getExpires_in();
mTencent.setAccessToken(token, expires);
mTencent.setOpenId(openId);
mUserInfo=new UserInfo(MainActivity.this, mTencent.getQQToken());
mUserInfo.getUserInfo(new UserInfoListener());
我们需要 获得 userInfo ,而 userInfo 初始化需要 mTencent 的帮助,所以 “设置openid和token,否则获取不到下面的信息” 非常重要,因为不设置的话,
mUserInfo=new UserInfo(MainActivity.this, mTencent.getQQToken());
执行获得的 mUserInfo会为空
ok,现在我们已经获得 不为空的 mUserInfo 了,那么get 到用户信息,我们还要用到 UserInfo 的另一个方法:
mUserInfo.getUserInfo(new UserInfoListener());
方法很简单,里面也是一个监听类 UserInfoListener
很遗憾,我们这个 UserInfoListener 类也 实现了 IUiListener 接口,其代码为:
/**获得qq登陆用户信息**/
class UserInfoListener implements IUiListener{
@Override
public void onComplete(Object obj) {
// TODO Auto-generated method stub
Log.i("","======用户信息======="+obj.toString());
//figureurl_qq_2为用户图像的url
QQUserInfo qQUserInfo=JsonParserUtil.getQQUserInfo(obj.toString());
Log.i("","===用户信息===="+qQUserInfo.getFigureurl_qq_2());
Log.i("","===用户信息===="+qQUserInfo.getNickname());
}
@Override
public void onCancel() {
// TODO Auto-generated method stub
}
@Override
public void onError(UiError arg0) {
// TODO Auto-generated method stub
}
}
此处 返回的用户信息大概是这样的:
{
"is_yellow_year_vip": "x",
"ret": x,
"figureurl_qq_1": "http://xxxxxxxxx",
"figureurl_qq_2": "http://xxxxxxxxxxx",
"nickname": "xxxxxxx",
"yellow_vip_level": "x",
"is_lost": x,
"msg": "",
"city": "xxx",
"figureurl_1": "http://xxxxxxxxxx",
"vip": "x",
"level": "x",
"figureurl_2": "http://xxxxxxxxxxxxxxxxxxx",
"province": "xxxxxx",
"is_yellow_vip": "xxxxx",
"gender": "xxxxx",
"figureurl": "http://xxxxxxxxxxx"
}
我也是将其解析后封装在 自己写的 QQUserInfo 类中,然后通过
Log.i("","===用户图像 url===="+qQUserInfo.getFigureurl_qq_2());
Log.i("","===用户昵称===="+qQUserInfo.getNickname());
获得用户的 图像 url 和 昵称,当然,你也可以 根据上面的 json 数据获得更多个人信息
那么接下来的 通过 url 获取 bitmap 以及 昵称和 bitmap 的显示 我就不多讲了,需要注意的是 bitmap 通过 url 获取 图像,是要重开线程获取的,另外 昵称和 图像的显示要从线程中传到 handler 中显示
需要注意的是,全部做完以后,测试的时候开始都是测试的开发者自己的qq号,需要你将做好的app在腾讯开发者平台上发布经审核之后,才能正常使用
OK,今天就说这么多,感觉腾讯 qq 的文档是 一团糟啊,各种坑,唉!