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 Tencent mQQTencent;

//QQ SDK初始化
mQQTencent = Tencent.createInstance("这里输入APPID",this);

2)、QQ授权登录,获取QQ授权登录基础数据:openID、accessToken、expiresIn

/**
 * 自定义QQ授权登录监听
 */

private class BaseUiListener implements IUiListener{

@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 void onError(UiError uiError) {
        Toast.makeText(MainActivity.this,"授权失败",Toast.LENGTH_SHORT).show();
    }

@Override
    public void onCancel() {
        Toast.makeText(MainActivity.this,"取消授权",Toast.LENGTH_SHORT).show();

}
}

/** QQ授权登录回调监听*/
private BaseUiListener mBaseUiListener;

//初始化监听
mBaseUiListener = new BaseUiListener();
/**
 * QQ SDK实现授权登录
 * 第一个参数:上下文
 * 第二个参数:获取jar中的权限  all:jar包所有权限
 * 第三个参数:数据回调监听
 */

mQQTencent.login(this,"all",mBaseUiListener);

/**
 * 必须在这个方法里面添加回调,否则获取不到数据
 * 但是测试过这里的监听没有返回数据,真正的回调数据在login()方法里面的监听数据里
 * 联系QQ客服,居然说没有技术支持
 */

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Tencent.onActivityResultData(requestCode,resultCode,data,new BaseUiListener());
    super.onActivityResult(requestCode, resultCode, data);
}

3)、根据Token获取用户信息

//获取用户信息
mQQTencent.setOpenId(openID);
mQQTencent.setAccessToken(accessToken,expires);
QQToken qqToken = mQQTencent.getQQToken();
mUserInfo = new UserInfo(getApplicationContext(),qqToken);
mUserInfo.getUserInfo(new IUiListener() {
    @Override
    public void onComplete(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 void onError(UiError uiError) {
        Log.e("LKing","用户消息获取失败");
    }

@Override
    public void onCancel() {
        Log.e("LKing","用户消息获取取消");
    }
});

5. 完整QQ登录代码

public class MainActivity extends ParentActivity {
    /** QQ初始化类*/
    
private Tencent mQQTencent;
    /** QQ授权登录回调监听*/
    
private BaseUiListener mBaseUiListener;
    /** QQ授权登录之后获取用户信息*/
    
privateUserInfo mUserInfo;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.custom_layout);

//QQ SDK初始化
        
mQQTencent= Tencent.createInstance("1106341755",this);
        //初始化监听
        
mBaseUiListener= new BaseUiListener();
        /**
         * QQ SDK实现授权登录
         * 第一个参数:上下文
         * 第二个参数:获取jar中的权限  all:jar包所有权限
         * 第三个参数:数据回调监听
         */
        
mQQTencent.login(this,"all",mBaseUiListener);

}

/**
     * 必须在这个方法里面添加回调,否则获取不到数据
     * 但是测试过这里的监听没有返回数据,真正的回调数据在login()方法里面的监听数据里
     * 联系QQ客服,居然说没有技术支持
     */
    
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //添加回调接收:测试过这里的监听没有返回数据,貌似就是个跳转回跳,真正的回调数据在login()方法里面的监听数据里
        
Tencent.onActivityResultData(requestCode,resultCode,data,new BaseUiListener());
        super.onActivityResult(requestCode, resultCode, data);
    }

/**
     * 自定义QQ授权登录监听
     */
    
private class BaseUiListener implements IUiListener{

@Override
        public void onComplete(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 = new UserInfo(getApplicationContext(),qqToken);
                mUserInfo.getUserInfo(new IUiListener() {
                    @Override
                    public void onComplete(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 void onError(UiError uiError) {
                        Log.e("LKing","用户消息获取失败");
                    }

@Override
                    public void onCancel() {
                        Log.e("LKing","用户消息获取取消");
                    }
                });
            }catch(Exception e){
                Toast.makeText(MainActivity.this,"授权失败,Json解析出错",Toast.LENGTH_SHORT).show();
            }
        }

@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();

}
    }

@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登录相关推荐

  1. AndroidQQ实现登录界面

    AndroidQQ登录界面 采用相对布局与线性布局的嵌套实现 具体代码: <?xml version="1.0" encoding="utf-8"?> ...

  2. Android QQ 登录接入详细介绍

    /   今日科技快讯   / 近日,百度地图发布2022春节出行大数据.迁徙大数据显示,2022年春运迁徙规模较去年农历同期有明显上升.春节期间全国人口迁徙规模日均值为去年农历同期的近两倍.春节前的迁 ...

  3. android第三方登录appid,AndroidQQ第三方登录

    集成QQ登录 在lib导入该open_sdk_r5886_lite.jar包 AndroidManifest.xml android:name="com.tencent.tauth.Auth ...

  4. selenium模拟浏览器解决反监测,获取cookies解决登录问题

    网络上设立了许多各种反爬的监测各式各样,但并不会非常的深入,如果要仔细获知应用了什么监测需要在控制台全局搜索webdriver去逆向分析一下再去设置将selenium伪装. 记录一下了解到的部分功能 ...

  5. Redis 笔记(11)— 文本协议 RESP(单行、多行字符串、整数、错误、数组、空值、空串格式、telnet 登录 redis)

    RESP 是 Redis 序列化协议Redis Serialization Protocol 的简写.它是一种直观的文本协议,优势在于实现异常简单,解析性能极好. ​ Redis 协议将传输的结构数据 ...

  6. hadoop 添加删除机器以及设置免密登录

    添加hadoop机器 先在slaves中添加机器 然后启动datanode $: ./usr/hadoop-0.20.2-cdh3u4/bin/hadoop-daemon.sh start datan ...

  7. linux环境下快速配置hadoop集群免密登录

    背景 在hadoop的日常使用过程中经常需要登录某些机器,如何更好的免密登录呢?这将为我们节省大量的时间 操作 假设你需要在A机器上免密登录B机器,那么你首先要确定B机器下是有秘钥文件的.如何确定是否 ...

  8. python实现简单的用户密码登录控制(输入三次就锁定用户)

    问题描述 我们经常在登录一些网站的时候,发现我们如果连续的输错好几次密码,我们的帐号就被锁定起来了,那这个过程是如何实现的呢?本程序主要就是解决以下3件事情 1.输入用户名密码 2.认证成功并显示欢迎 ...

  9. 【C#实践】详解三层转七层:登录

    背景 一开始借用别人的代码,敲完也是很多地方看不懂!不知道从什么地方下手!不懂三层到七层到底是怎么映射过去的! 后来就是多查,慢慢有大体的轮廓,逐个部分解决! 过程: 1.看整体,对于不懂的部分,先查 ...

  10. 【C#实践】三层实例:登录过程

    关于三层,看完一遍,想着开始敲七层,看着别人的代码敲都有点找不到,于是重新敲了一遍三层,收获很多! 首先,它没有模板,也不是一下子就完成的,它是有思路的,根据思路走,整个过程就是很自然而然的过程! D ...

最新文章

  1. nvidia旧版驱动_N卡用户注意:老版驱动存在5个高危漏洞,赶紧更新
  2. python生成器应用中的一个要点
  3. iOS开发里的Bundle是个啥玩意?!
  4. ABAP 屏幕上动态修改按钮的图标
  5. php设置ini_set无效,php ini_set函数无效怎么解决
  6. android数据库文件是否加密存储,详解Android数据存储之SQLCipher数据库加密
  7. STM8S001J3M3还能完这么多花样,开发板尝鲜体验。
  8. SpringBoot与JdbcTemplate的完美结合
  9. Virtual Box创建共享目录
  10. App Crash 详解
  11. VBA 贴片电阻名称转换
  12. 关于一维数组(小朋友都能明白的一维数组超详细介绍)
  13. 英语语法基础01(句子结构)
  14. html5贝塞尔函数,径向偏振高阶贝塞尔-高斯涡旋光束的传输及其偏振特性
  15. torch.ge()函数解读
  16. java毕业设计校园闲置物品租售系统mybatis+源码+调试部署+系统+数据库+lw
  17. 使用Android Studio编写一个简单的音乐盒
  18. 天威诚信董事长陈韶光、首席安全官李延昭入选武汉仲裁委员会仲裁员
  19. 源代码防泄密加密介绍
  20. NetWorkx Python API

热门文章

  1. 坐飞机时为什么不能说一路顺风
  2. 奇点云数据中台技术汇 | 数据治理——企业数字化转型的基石
  3. 周期性行业是什么意思_周期性股票是什么意思 周期性股票的特征有哪些
  4. 基于Element UI Calendar实现日程提醒功能
  5. plot函数--R语言
  6. Oracle:ORA-00054 资源正忙 -- 锁表的解决方法
  7. 友盟统计前台页面图表或文字的隐藏方法
  8. Hadoop伪分布和全分布部署指南
  9. spring.factory
  10. 惊呆!200行代码就能实现的隐身术你见过么?