您的位置:首页 > 移动开发 > Android开发

Android第三方登陆之QQ篇(原生登陆授权)

2016-12-18 14:01 417 查看
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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: