前天实现了网站的第三方QQ登入,今天在家贼无聊于是试着实现一下移动应用的第三方登入。我看了一下腾讯开发平台的SDK文档,其中有一部分无法看懂,不过我最终还是成功拿到用户的基本信息,所以没有继续专研(懒)。编写的例子已上传。下面我将自己的实现过程分享给大家。
准备工作:
(1)申请移动应用APP,和前天网站应用实现QQ登入的申请过程差不多,其中的应用包名和签名可以用AppManager获取:
将AppManager安装在手机上,选择你的应用复制就行了。如图:
申请成功后就获取到APP ID了
(2)下载官方的相关的SDK将里面的open_sdk.jar放到Android项目的libs目录下,点击右键Add as Library导入。
(3)在AndroidManifest.xml的<manifest>标签中加入下面相关的代码来添加权限等信息。如下:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- AuthActivity文件在jar中 --> <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="tencent加上你的APPID" /> </intent-filter> </activity> <!-- AssistActivit文件在jar中 --> <activity android:name="com.tencent.connect.common.AssistActivity" android:configChanges="orientation|keyboardHidden" android:screenOrientation="behind" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
其中这两个Activity文件在jar中,不用自己创建。
准备工作完成了,接下来开始敲代码耶耶耶。
实现过程:
第一步:编写一个继承IuiListener接口的类LoginBack,当登入成功时则会调用该类的onComplete方法,代码如下:
public class LoginBack implements IUiListener {
//登入QQ成功执行该方法
@Override
public void onComplete(Object o) {
//参数o就是授权相关的json数据
Toast.makeText(MainActivity.this,"授权成功",Toast.LENGTH_SHORT).show();
try {
JSONObject obj = new JSONObject(o.toString());
String openID = obj.getString("openid");
String accessToken = obj.getString("access_token");
String expires = obj.getString("expires_in");
tencent.setOpenId(openID);
tencent.setAccessToken(accessToken, expires);
QQToken qqToken = tencent.getQQToken();
UserInfo user = new UserInfo(getApplicationContext(), qqToken);
//获取用户信息调用
user.getUserInfo(new IUiListener() {
//获取用户信息成功调用该方法
@Override
public void onComplete(Object response) {
//参数response就是用户信息的json数据
Toast.makeText(MainActivity.this,"获取用户信息成功",Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(UiError uiError) {
Toast.makeText(MainActivity.this,"获取信息失败",Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
Toast.makeText(MainActivity.this,"取消获取信息",Toast.LENGTH_SHORT).show();
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(UiError uiError) {
Toast.makeText(MainActivity.this,"授权失败",Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
Toast.makeText(MainActivity.this,"取消登入",Toast.LENGTH_SHORT).show();
}
第二步:编写一个Activity类文件,在类中声明的对象。如下:
//Tencent是调用QQ登入等操作的类
private Tencent tencent=null;
//前面声明的类,在QQ登入后会调用其中的方法
private LoginBack back=null
第三步:在该Activity中的onCreate方法中初始化上一步的对象:
tencent=Tencent.createInstance("你的APPID",this.getApplicationContext());
back=new LoginBack();
第四步:在该Activity中加入相关回传数据的方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//这里不能用onActivityResult方法,本人测试调用QQ无反应
tencent.onActivityResultData(requestCode,resultCode,data,back);
}
第五步:在按钮点击事件中加入下面代码来调用QQ登入:
if(!tencent.isSessionValid()){
tencent.login(MainActivity.this,"all",back);
}
然后就大功告成了。
其他:在Activity文件的退出登入按钮点击事件中加入下面代码,实现退出登入:
tencent.logout(this);
当登入成功就会执行back中的onComplete方法:
授权成功调用该方法的参数o代表的json数据是:
{
"ret":0,
"openid":"5E3BDxxxxxxxxxxxx960354FA570221",
"access_token":"769E0xxxxxxxxxxxxxxxxxx35932",
"pay_token":"5D3D380xxxxxxxxxxxxxxxxxxD1A01A54C9",
"expires_in":7776000,
"pf":"desktop_m_qq-16600144-android-266-",
"pfkey":"d5bc227xxxxxxxxxxxxx0063164f",
"msg":"",
"login_cost":60,
"query_authority_cost":173,
"authority_cost":866,
"expires_time":1573806660111
}
获取用户成功调用该方法的参数reponse代表的json数据是:
{
"ret":0,
"msg":"",
"is_lost":0,
"nickname":"可乐xxxx_",
"gender":"男",
"province":"广东",
"city":"深圳",
"year":"1994",
"constellation":"",
"figureurl":"http:\/\/qzapp.qlogo.cn\xxxxxxxx",
"figureurl_1":"http:\/\/qzapp.qlogo.cn\xxxxxxxxx",
"figureurl_2":"http:\/\/qzapp.qlogo.cn\xxxxxxxx",
"figureurl_qq_1":"http:\/\/thirdqq.qlogo.cn\/g?b=xx&k=xxxx&s=40&t=xxxxx",
"figureurl_qq_2":"http:\/\/thirdqq.qlogo.cn\/g?b=xxxx&xxxxxxxxx&s=xxx&t=xxxxxx",
"figureurl_qq":"http:\/\/thirdqq.qlogo.cn\/g?b=xxxxx&k=xxxxxx&s=xxx&t=xxxxx",
"figureurl_type":"1",
"is_yellow_vip":"0",
"vip":"0",
"yellow_vip_level":"0",
"level":"0",
"is_yellow_year_vip":"0"
}
该json数据和网页登入获取的用户基本信息是一样的。
我是程序小白,每次进步一丢丢。