AndroidQQ登录
来源:互联网 发布:淘宝卖家插件哪个好 编辑:程序博客网 时间:2024/06/15 06:52
AndroidQQ登录
一、注册腾讯开放平台账号
1. 在腾讯开放平台注册账号获取开发者资格:http://open.qq.com/
2. 注册完成后点击右上角的管理中心,点击右下角的创建应用
3. 创建应用之后就会获取到APPID和APPKEY
4. 下载SDKjar包:http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD
注:OpenSDK从2.4版本开始,在原有接口的基础上,提炼重要及常用接口,生成了基础包,使用QQ登录只需要使用基础包就OK了。对应包名如下:
全量包:open_sdk_r****.jar
基础包:open_sdk_r****_lite.jar
基础包包含接口:
1) 登录相关接口
2) 获取用户信息接口
3) 定向分享接口
a、分享给QQ好友
b、分享给Qzone好友
4) 社交类API
a、邀请好友
b、应用分享
c、发送请求/礼物
二、实现QQ登录
1. 将open_sdk_r****_lite.jar基础包放入主项目libs文件夹下,同步Gradle
项目对应jar包:http://download.csdn.net/download/binjianliu/9983434
2. 在清单文件Androidmanifest.xml中添加QQ登录授权所需权限
<!-- QQ登录授权所需权限-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
3. 注册QQ登录SDK中所要使用的Activity
<!-- QQ登录-->
<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"/>
<!--开放平台获取的APPID 在开放平台的appid之前加上tencentAPPID-->
<data android:scheme="tencent110000000"/>
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
4. 进行QQ登录
1)、初始化QQ登录类
/** QQ初始化类*/
private TencentmQQTencent;
//QQ SDK初始化
mQQTencent = Tencent.createInstance("这里输入APPID",this);
2)、QQ授权登录,获取QQ授权登录基础数据:openID、accessToken、expiresIn
/**
* 自定义QQ授权登录监听
*/
private class BaseUiLostener implementsIUiListener{
@Override
public voidonComplete(Object obj) {
Toast.makeText(MainActivity.this,"授权成功",Toast.LENGTH_SHORT).show();
//解析QQ授权登录基础数据
JSONObject object = (JSONObject)obj;
try{
String openID = object.getString("openid");
String accessToken = object.getString("access_token");
String expires = object.getString("expires_in");
}catch(Exception e){
Toast.makeText(MainActivity.this,"授权失败,Json解析出错",Toast.LENGTH_SHORT).show();
}
}
@Override
public voidonError(UiError uiError) {
Toast.makeText(MainActivity.this,"授权失败",Toast.LENGTH_SHORT).show();
}
@Override
public voidonCancel() {
Toast.makeText(MainActivity.this,"取消授权",Toast.LENGTH_SHORT).show();
}
}
/** QQ授权登录回调监听*/
private BaseUiLostenermBaseUiLostener;
//初始化监听
mBaseUiLostener = newBaseUiLostener();
/**
* QQ SDK实现授权登录
* 第一个参数:上下文
* 第二个参数:获取jar中的权限 all:jar包所有权限
* 第三个参数:数据回调监听
*/
mQQTencent.login(this,"all",mBaseUiLostener);
/**
* 必须在这个方法里面添加回调,否则获取不到数据
* 但是测试过这里的监听没有返回数据,真正的回调数据在login()方法里面的监听数据里
* 联系QQ客服,居然说没有技术支持
*/
@Override
protected void onActivityResult(intrequestCode,intresultCode, Intent data) {
Tencent.onActivityResultData(requestCode,resultCode,data,newBaseUiLostener());
super.onActivityResult(requestCode, resultCode, data);
}
3)、根据Token获取用户信息
//获取用户信息
mQQTencent.setOpenId(openID);
mQQTencent.setAccessToken(accessToken,expires);
QQToken qqToken = mQQTencent.getQQToken();
mUserInfo =newUserInfo(getApplicationContext(),qqToken);
mUserInfo.getUserInfo(newIUiListener() {
@Override
public voidonComplete(Object o) {
Log.e("LKing","用户消息= "+o.toString());
//结果:
// {"ret":0,"msg":"","is_lost":0,"nickname":"LKing",
// "gender":"男","province":"陕西","city":"西安",
// "figureurl":"http:\/\/qzapp.qlogo.cn\/qzapp\/1106341755\/690318232C185C0CFBB34C85A08F3775\/30",
// "figureurl_1":"http:\/\/qzapp.qlogo.cn\/qzapp\/1106341755\/690318232C185C0CFBB34C85A08F3775\/50",
// "figureurl_2":"http:\/\/qzapp.qlogo.cn\/qzapp\/1106341755\/690318232C185C0CFBB34C85A08F3775\/100",
// "figureurl_qq_1":"http:\/\/q.qlogo.cn\/qqapp\/1106341755\/690318232C185C0CFBB34C85A08F3775\/40",
// "figureurl_qq_2":"http:\/\/q.qlogo.cn\/qqapp\/1106341755\/690318232C185C0CFBB34C85A08F3775\/100",
// "is_yellow_vip":"0","vip":"0","yellow_vip_level":"0","level":"0","is_yellow_year_vip":"0"}
}
@Override
public voidonError(UiError uiError) {
Log.e("LKing","用户消息获取失败");
}
@Override
public voidonCancel() {
Log.e("LKing","用户消息获取取消");
}
});
5. 完整QQ登录代码
public classMainActivityextendsParentActivity {
/** QQ初始化类*/
privateTencentmQQTencent;
/** QQ授权登录回调监听*/
privateBaseUiLostenermBaseUiLostener;
/** QQ授权登录之后获取用户信息*/
privateUserInfomUserInfo;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_layout);
//QQ SDK初始化
mQQTencent= Tencent.createInstance("1106341755",this);
//初始化监听
mBaseUiLostener=newBaseUiLostener();
/**
* QQ SDK实现授权登录
* 第一个参数:上下文
* 第二个参数:获取jar中的权限 all:jar包所有权限
* 第三个参数:数据回调监听
*/
mQQTencent.login(this,"all",mBaseUiLostener);
}
/**
* 必须在这个方法里面添加回调,否则获取不到数据
* 但是测试过这里的监听没有返回数据,真正的回调数据在login()方法里面的监听数据里
* 联系QQ客服,居然说没有技术支持
*/
@Override
protected voidonActivityResult(intrequestCode,intresultCode, Intent data) {
//添加回调接收:测试过这里的监听没有返回数据,貌似就是个跳转回跳,真正的回调数据在login()方法里面的监听数据里
Tencent.onActivityResultData(requestCode,resultCode,data,newBaseUiLostener());
super.onActivityResult(requestCode, resultCode, data);
}
/**
* 自定义QQ授权登录监听
*/
private classBaseUiLostenerimplementsIUiListener{
@Override
public voidonComplete(Object obj) {
Toast.makeText(MainActivity.this,"授权成功",Toast.LENGTH_SHORT).show();
//解析QQ授权登录基础数据
JSONObject object = (JSONObject)obj;
Log.e("LKing","json = "+object.toString());
//结果:
// {"ret":0,"openid":"690318232C185C0CFBB34C***",
// "access_token":"64EA773D7521218E8AFC3134***",
// "pay_token":"A6186F3E6CC29AF696***",
// "expires_in":777***,"pf":"desktop_m_qq-10000144-***",
// "pfkey":"c6e73ba69433e0a0d63f5***",
// "msg":"","login_cost":119,"query_authority_cost":204,
// "authority_cost":14217}
try{
String openID = object.getString("openid");
String accessToken = object.getString("access_token");
String expires = object.getString("expires_in");
//获取用户信息
mQQTencent.setOpenId(openID);
mQQTencent.setAccessToken(accessToken,expires);
QQToken qqToken =mQQTencent.getQQToken();
mUserInfo=newUserInfo(getApplicationContext(),qqToken);
mUserInfo.getUserInfo(newIUiListener() {
@Override
public voidonComplete(Object o) {
Log.e("LKing","用户消息= "+o.toString());
//结果:
// {"ret":0,"msg":"","is_lost":0,"nickname":"LKing",
// "gender":"男","province":"陕西","city":"西安",
// "figureurl":"http:\/\/qzapp.qlogo.cn\/qzapp\/1106341755\/690318232C185C0CFBB34C85A08F3775\/30",
// "figureurl_1":"http:\/\/qzapp.qlogo.cn\/qzapp\/1106341755\/690318232C185C0CFBB34C85A08F3775\/50",
// "figureurl_2":"http:\/\/qzapp.qlogo.cn\/qzapp\/1106341755\/690318232C185C0CFBB34C85A08F3775\/100",
// "figureurl_qq_1":"http:\/\/q.qlogo.cn\/qqapp\/1106341755\/690318232C185C0CFBB34C85A08F3775\/40",
// "figureurl_qq_2":"http:\/\/q.qlogo.cn\/qqapp\/1106341755\/690318232C185C0CFBB34C85A08F3775\/100",
// "is_yellow_vip":"0","vip":"0","yellow_vip_level":"0","level":"0","is_yellow_year_vip":"0"}
}
@Override
public voidonError(UiError uiError) {
Log.e("LKing","用户消息获取失败");
}
@Override
public voidonCancel() {
Log.e("LKing","用户消息获取取消");
}
});
}catch(Exception e){
Toast.makeText(MainActivity.this,"授权失败,Json解析出错",Toast.LENGTH_SHORT).show();
}
}
@Override
public voidonError(UiError uiError) {
Toast.makeText(MainActivity.this,"授权失败",Toast.LENGTH_SHORT).show();
}
@Override
public voidonCancel() {
Toast.makeText(MainActivity.this,"取消授权",Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mQQTencent.logout(this);
}
}
注:
1) 应用未上线要测试QQ登录数据,可在“应用管理”--“安卓应用”--“基础服务”--“QQ登录”--“应用调试者”中添加调试QQ账号(添加的账号必须和注册平台的QQ账号是好友关系)
2) 记得在QQ授权登录成功之后,在onDestroy()中要注销
三、获取UnionID
如果开发者拥有多个移动应用、网站应用,可以通过获取用户的UnionID来确定用户的唯一性。
1. 获取UnionID
https请求方式:GET
String httpUrl ="https://graph.qq.com/oauth2.0/me?access_token="+mQQToken+"&unionid=1";
2. 获取成功,返回Json数据
{"client_id":"YOUR_APPID","openid":"YOUR_OPENID","unioid":"YOUR_UNIONID"}
client_id:应用的APPID
openid:QQ用户的唯一标识,对当前开发者账号唯一
unioid:QQ用户的统一标识,对当前开发者账号唯一
3. 获取失败,返回Json数据
{"error":100016,"error_description":"access token check failed"}
100016:access token check failed 用户凭证过期(90天)或者不正确
100048:companyid not set未申请unionid接口调用权限,联系客服
- AndroidQQ登录
- androidQQ登录获取用户信息
- AndroidQQ第三方登录
- AndroidQQ第三方登录个人详情获取
- AndroidQQ第三方登陆
- androidQQ头像圆角代码
- centos 7安装oraclehttp://www.linuxidc.com/Linux/2016-04/130559.htm?&from=androidqq
- 登录
- 登录
- 登录
- 登录
- 登录
- 登录
- 登录
- 登录
- 登录
- 登录
- 登录
- Android中的windowSoftInputMode属性详解
- TCP 与 UDP 的区别及应用场景
- cf 858F
- 深度学习(八)——fine-tuning, 李飞飞
- 9.17NOIP模拟赛
- AndroidQQ登录
- 7-26 单词长度(15 分)
- CentOS7之常用服务
- jQuery学习入门(一)
- python decorator
- Object-C的编译命令
- Nginx编译安装
- hdfs——hadoop文件读写操作
- 在共享内存实现 Redis(上)