AndroidQQ登录

news/2024/10/31 5:35:22/

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接口调用权限,联系客服

 


http://www.ppmy.cn/news/617536.html

相关文章

QQ传输协议分析

一、 实验目的&#xff1a; 在虚拟机下NAT模式下通过Wireshark抓包&#xff0c;分析QQ的传输模式。了解QQ在传输信息过程中用到的协议。分析在Nat模式下&#xff0c;信息传输的穿透性。 二、 实验环境&#xff1a; Win7 专业版32位&#xff08;在虚拟机里面&#xff09;。 Win…

QQ协议分析总结

QQ传输协议分析 http://www.mamicode.com/info-detail-866314.html 一、 实验目的&#xff1a; 在虚拟机下NAT模式下通过Wireshark抓包&#xff0c;分析QQ的传输模式。了解QQ在传输信息过程中用到的协 议。分析在Nat模式下&#xff0c;信息传输的穿透性。 二、 实验环境&#x…

Android QQ登录集成

1、首先到腾讯开放平台创建应用&#xff0c;并上线——使用有效APP ID才可以进行qq登录 腾讯开放平台&#xff1a;https://open.tencent.com/ 上线后APP ID 2、下载腾讯sdk&#xff1a;https://download.csdn.net/download/meixi_android/10842092 3、activity代码详情&#…

qq公司的08年招聘面试题:10只狗找毒药

问题描述1000瓶药水&#xff0c;其中至多有1瓶剧毒&#xff0c;现在给你10只小狗在24小时内通过小狗试药的方式找出哪瓶药有毒或者全部无毒&#xff08;小狗服完药20小时后才能判断是否中毒&#xff09; 分析&#xff1a;“1000瓶药水&#xff0c;其中至多有1瓶剧毒”可以分成…

简述CMMI认证各级别的特点

CMMI即能力成熟度模型集成&#xff0c;是一种评估或者认证制度。其核心理念是&#xff1a;过程决定质量。CMMI评估的核心内容也是过程。主要是由CMMI研究院主任评估师按照CMMI模型检查企业或组织的软件开发过程是否达到了CMMI某个级别的要求。CMMI是世界公认的软件产品进入国际…

Java 针对Word模板内容替换输出

对应依赖 <repositories><!-- 使用 Free Spire.Doc for Java 的jar包实现替换word中的内容--><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://repo.e-iceblue.cn/repository/maven-public/</url&…

_02-祖玛大消除

题意&#xff1a; 如果射出的球击中球链&#xff0c;且此时生成的新链中相同颜色的球大于等于3个。则这些球可以被消除。 例如&#xff0c;你有一串链是&#xff1a;112233。此时你射出一个2的球&#xff0c;球击中了链中的第一个2&#xff08;第3个球&#xff09;&#xff0…

清华数据结构PA02 祖玛(zuma)

这是清华大学邓公的数据结构第三章列表(list)所对应的problem assignment&#xff0c;贴出text&#xff1a; 描述 祖玛是一款曾经风靡全球的游戏&#xff0c;其玩法是&#xff1a;在一条轨道上初始排列着若干个彩色珠子&#xff0c;其中任意三个相邻的珠子不会完全同色。此后&…