QQ授权登陆其实,在现在的APP中也是非常常见的,今天我们主要探讨一下QQ原生授权登陆的那些事。
首先,我们得去qq开放平台上去注册申请,传送门http://open.qq.com/,如下点击:
然后我们进行相关的创建我们的应用,如下所示:
完善相关的信息,提交审核等等,这里面我们最重要的就是APP ID,以及APP KEY,前期工作准备好,我们进行我们的接入工作:
首先,我们先看看官方的开发文档,http://wiki.open.qq.com/wiki/QQ%E7%94%A8%E6%88%B7%E8%83%BD%E5%8A%9B,图示如下:
其中,标注箭头的地方使我们最需要使用的,关于SDk下载的话,由于我们只牵扯到QQ的登陆,没有需要太多的东西,所以我们只需要下载基础包既可以,最新的最下:
附:基础包、全量包对比:
OpenSdk从2.4版本开始,在原有接口的基础之上,提炼重要及常用接口,生成基础包
对应包名如下:
全量包:open_sdk_r****.jar
基础包:open_sdk_r****_lite.jar
基础包包含接口:
1、登陆相关接口
2、获取用户信息接口
3、定向分享接口
a、分享给QQ好友
b、分享给Qzone好友
4、社交类API
a、邀请好友
b、应用分享
c、发送请求/礼物
包大小
全量包:514K
基础包:254K
下载完基础包后,解压后如下:
直接导入到studio libs中,添加as Library
配置AndroidManifest
在应用的AndroidManifest.xml增加配置的节点下增加以下配置(注:不配置将会导致无法调用API);
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application>
<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="tencent你的AppId" />
</intent-filter>
</activity>
<application>
//SDK_V2.0引入了AssistActivity,开发者需在androidManifest.xml中注册。代码如下:
<activity android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"
/>
//这个必须有,吐槽一下,腾讯的文档太old了
<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" />
//其中的100000是你申请的APP ID,替换成自己的即可
<data android:scheme="tencent100000" />
</intent-filter>
</activity>
我们来看看腾讯qq的创建实例并回调文档:
那么我们照着开发文档走,就完全可以搞定了,具体代码如下,自己封装成了工具类:
public class QQLogin {
public static Tencent mTencent;
private Activity mActivity;
private QQLogin() {
mTencent = Tencent.createInstance(Constants.QQAPPID,Application.getContext());
}
private static class SingTonHolder {
/* 静态初始化器,由JVM来保证线程安全 */
private static QQLogin instance = new QQLogin();
}
public static QQLogin getInstance() {
return SingTonHolder.instance;
}
public void qq_loginout(Activity activity) {
this.mActivity = activity;
if (mTencent == null) {
mTencent = Tencent.createInstance(Constants.QQAPPID, Application.getContext());
}
mTencent.logout(mActivity);
}
public void qq_login(Activity activity) {
this.mActivity = activity;
if (mTencent == null) {
mTencent = Tencent.createInstance(Constants.QQAPPID, Application.getContext());
}
if (!mTencent.isSessionValid()) {
mTencent.login(mActivity, "all", new LoginUiListener(mActivity));
}
}
}
LoginUiListener
public class LoginUiListener implements IUiListener {
private Activity activity;
public LoginUiListener(Activity activity) {
this.activity = activity;
}
@Override
public void onComplete(Object o) {
String result = o.toString();
QQloginResultInfo loginInfo = JSON.parseObject(result, QQloginResultInfo.class);
final String openid = loginInfo.getOpenid();
final String access_token = loginInfo.getAccess_token();
QQLogin.mTencent.setOpenId(openid);
QQLogin.mTencent.setAccessToken(loginInfo.getAccess_token(), String.valueOf(loginInfo.getExpires_in()));
UserInfo userInfo = new UserInfo(XApplication.getContext(), QQLogin.mTencent.getQQToken());
userInfo.getUserInfo(new IUiListener() {
@Override
public void onComplete(Object o) {
Log.e("xxxx", o.toString());
//自此我们就可以获取到相关的用户信息,进行我们自己的相关业务逻辑操作
QQuserinfo userinfo = JSON.parseObject(o.toString(), QQuserinfo.class);
String nickname = userinfo.getNickname();
String avatar = userinfo.getFigureurl_qq_2();
}
@Override
public void onError(UiError uiError) {
}
@Override
public void onCancel() {
}
});
}
@Override
public void onError(UiError uiError) {
}
@Override
public void onCancel() {
}
不要忘记在相应的activity中的onActivityResult()方法中添加:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//这里的11101,是调用腾讯sdk是,有日志输出的请求码
if (requestCode == 11101) {
Tencent.onActivityResultData(requestCode, resultCode, data, new LoginUiListener(this));
}
super.onActivityResult(requestCode, resultCode, data);
}