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

注:OpenSDK2.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中的权限  alljar包所有权限
 * 第三个参数:数据回调监听
 */
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中的权限  alljar包所有权限
         * 第三个参数:数据回调监听
         */
        
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

openidQQ用户的唯一标识,对当前开发者账号唯一

unioidQQ用户的统一标识,对当前开发者账号唯一

3. 获取失败,返回Json数据

{"error":100016,"error_description":"access token check failed"}

100016access token check failed 用户凭证过期(90天)或者不正确

100048companyid not set未申请unionid接口调用权限,联系客服