集成源生的QQ登录详解:实现登录和退出并拿到用户的信息

最近几天项目赶的很紧,天天加班到凌晨,一直没时间来写博客,今天抽空来跟大家分享一下集成源生的QQ登录

首先肯定是去下载SDK   下载地址是:http://wiki.open.qq.com/wiki/mobile/SDK下载   

效果




然后解压压缩包,把里面

jar文件夹下面的两个jar包导入到工程目录的libs文件夹下

全选之后右键,选择add As Library,  如果不as Library的话,jar包导进来是没有任何效果的

接下来就可以用了官方文档

http://wiki.open.qq.com/wiki/QQ%E7%99%BB%E5%BD%95%E5%92%8C%E6%B3%A8%E9%94%80

其中还得需要腾讯授权的AppId  用来识别不同集成登录的app ,接下来说说怎么拿到appId

进入腾讯开放着平台http://open.qq.com/          然后登录,进入管理中心,创建应用,创建完成之后就可以得到appId了


点击进入之后



接下来就是在代码中使用了,其实使用起来很简单

首先是吧下面这些代码复制到 AndroidManifest.xml里面

<span style="font-size:18px;"></span><pre style="background-color: rgb(255, 255, 255); font-family: 宋体; font-size: 12.8pt;"><pre name="code" class="html"><pre style="background-color: rgb(255, 255, 255); font-family: 宋体; font-size: 12.8pt;"><pre name="code" class="html"> <activity
            android:name="com.tencent.tauth.AuthActivity"
            android:noHistory="true"
            android:screenOrientation="portrait"
            android:launchMode="singleTask" >
            <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="tencent1105721156" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:configChanges="orientation|keyboardHidden|screenSize"
            />


 
 
 
 

其中

<data android:scheme="tencent1105721156" /><pre name="code" class="html"><span style="font-size:18px;">是appid,前面是tencent后面是appid</span>


 

添加2个权限

<span style="font-size:18px;"><uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/></span>


然后在xml文件

<span style="font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical"
              android:paddingBottom="25dp"
              android:paddingLeft="10dp"
              android:paddingRight="10dp"
              android:paddingTop="25dp">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/user_logo"
            android:layout_width="90dp"
            android:layout_height="90dp"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="bottom"
            android:text="姓名:"
            android:textColor="#80505050"
            android:textSize="18sp"/>
        <TextView
            android:id="@+id/user_nickname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="bottom"
            android:text="姓名"
            android:textColor="#80505050"
            android:textSize="18sp"/>
    </LinearLayout>

    <Button
        android:id="@+id/new_login_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="login"
        android:text="点击登录"/>

    <TextView
        android:id="@+id/user_inf"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="用户信息:"
        android:textColor="#80505050"
        android:textSize="18sp"/>

</LinearLayout></span>

拿到用户信息有3个步骤:

1,调用login()方法,成功回调得到一串json

2,解析后拿到accessToken,openId,expires,,然后调用

//**下面这两步设置很重要,如果没有设置,返回为空**
mTencent.setOpenId(openID);
mTencent.setAccessToken(accessToken, expires);
//去拿图像和昵称
UserInfo userInfo = new UserInfo(MainActivity.this, mTencent.getQQToken());
3,在监听回调方法中拿到一串json,解析拿到用户信息,
 

代码中注释很清楚了,就不一一讲解了:

<pre name="code" class="html">package com.example.administrator.qqqlogindemo;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.tencent.connect.UserInfo;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;

import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {


    //app_id
    public static final String app_id = "1105721156";
    //qq的操作对象
    static Tencent mTencent;
    //点击登录的按钮
    private Button login_btn;
    private TextView mUserName;
    private ImageView mUserHead;//头像
    TextView mUserInformation = null;//用户信息

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTencent = Tencent.createInstance(app_id, this.getApplicationContext());
        initViews();

    }

    private void initViews() {
        mUserInformation = (TextView) findViewById(R.id.user_inf);//用户信息
        mUserName = (TextView) findViewById(R.id.user_nickname);//姓名
        mUserHead = (ImageView) findViewById(R.id.user_logo);//头像
        login_btn = (Button) findViewById(R.id.new_login_btn);

    }

    /**
     * 登录按钮点击监听
     */
    public void login(View view) {
        //如果没登录
        if (!mTencent.isSessionValid()) {
            loginQQ();

        } else {
            //如果已经登录了,点击按钮就调用logout()方法来退出qq
            mTencent.logout(this);
            Toast.makeText(this, "退出登录成功", Toast.LENGTH_SHORT).show();
            login_btn.setText("点击登录");
        }
    }

    /**
     * 创建一个登录qq的方法
     */
    private void loginQQ() {
        /*
        mTencent.login(Activity activity,String s,IUiListener IuIListener)
        调用login()方法登录qq,
        1,传入一个上下文,
        2,一个获取用户信息的权限,我这里传入的是所有权限all,
        3,回调监听,监听是否授权成功
         */
        mTencent.login(this, "all", new IUiListener() {
            //授权成功,
            @Override
            public void onComplete(Object object) {
                Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
                login_btn.setText("已登录,点击退出");
            //成功之后返回的数据object是一串json数据
                  /*{
            "access_token": "B784CECD31D1C22578F4790FEECE9B3B",
            "authority_cost": 0,
            "expires_in": 7776000,
            "login_cost": 17574,
            "msg": "",
             "openid": "2EE8A32F5E1FB9E131CED0538B679296",
             "pay_token": "DFCC73C38AF022356383355719CBFBFA",
             "pf": "desktop_m_qq-10000144-android-2002-",
            "pfkey": "37ad0a9ed6c2280b38ac73dd781b70af",
            "query_authority_cost": 321,
            "ret": 0
                }
            */
                getToken(object);//解析

            }

            //授权失败
            @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();

            }
        });
    }
    /**
     * 解析数据拿到token,openID,expires的方法,
     *因为只有拿到这3货才能进一步去拿用户的信息
     * @param value
     * @return token
     */
    private void getToken(final Object value) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //解析拿到的数据,得到token
                    JSONObject jo = (JSONObject) value;
                    int ret = jo.getInt("ret");
                    if (ret == 0) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                            }
                        });
                        //拿到token
                        String accessToken = jo.getString("access_token");
                        //在拿到这两货
                        String openID = jo.getString("openid");
                        String expires = jo.getString("expires_in");
                        //**下面这两步设置很重要,如果没有设置,返回为空**
                        mTencent.setOpenId(openID);
                        mTencent.setAccessToken(accessToken, expires);
                        //去拿图像和昵称
                        UserInfo userInfo = new UserInfo(MainActivity.this, mTencent.getQQToken());
                        //调用api方法去拿信息,在传入一个监听回调,看是否拿到用户信息
                        userInfo.getUserInfo(getQQinfoListener);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /**
     * 通过token和openId重新监听,去拿到图像和昵称
     */
    private IUiListener getQQinfoListener = new IUiListener() {

        @Override
        public void onComplete(final Object response) {
            //response包含的信息
                 /*{
            "city": "",
            "figureurl": "http://qzapp.qlogo.cn/qzapp/1105646109/2EE8A32F5E1FB9E131CED0538B679296/30",
            "figureurl_1": "http://qzapp.qlogo.cn/qzapp/1105646109/2EE8A32F5E1FB9E131CED0538B679296/50",
            "figureurl_2": "http://qzapp.qlogo.cn/qzapp/1105646109/2EE8A32F5E1FB9E131CED0538B679296/100",
            "figureurl_qq_1": "http://q.qlogo.cn/qqapp/1105646109/2EE8A32F5E1FB9E131CED0538B679296/40",
            "figureurl_qq_2": "http://q.qlogo.cn/qqapp/1105646109/2EE8A32F5E1FB9E131CED0538B679296/100",
            "gender": "男",
            "is_lost": 0,
            "is_yellow_vip": "0",
            "is_yellow_year_vip": "0",
            "level": "0",
            "msg": "",
            "nickname": " 段炼",
            "province": "北京",
            "ret": 0,
            "vip": "0",
            "yellow_vip_level": "0"
            }
        * */
            //成功拿到这个信息调用这个方法
            //开线程去解析数据
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        if (response != null) {
                            JSONObject jsonObject = (JSONObject) response;
                            //拿到qq登录的昵称
                            final String nickname = jsonObject.getString("nickname");
                            if (((JSONObject) response).has("figureurl")) {
                                //小头像的网址
                                final String userHeard = jsonObject.getString("figureurl_qq_1");
                                //大分辨率的头像网址
                                final String userHeard1 = jsonObject.getString("figureurl_qq_2");
                                //性别
                                String sex = jsonObject.getString("gender");
                                //省   如果是直辖市的话city为空,province显示为市
                                String province = jsonObject.getString("province");
                                //市,如果是直辖市的话city为空
                                String city = jsonObject.getString("city");
                                //开启主线程来更新Ui
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        //用户信息
                                        mUserInformation.setText(response+"");
                                        //昵称
                                        mUserName.setText(nickname.toString());
                                        //设置头像
                                        Glide.with(MainActivity.this).load(userHeard1).into(mUserHead);
                                    }
                                });
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }

        @Override
        public void onError(UiError uiError) {
            //  获取信息失败
        }

        @Override
        public void onCancel() {
            //取消

        }
    };


}


 
 

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.administrator.qqqlogindemo">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.tauth.AuthActivity"
            android:noHistory="true"
            android:screenOrientation="portrait"
            android:launchMode="singleTask" >
            <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="tencent1105721156" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:configChanges="orientation|keyboardHidden|screenSize"
            />
    </application>

</manifest>


demo下载地址:http://download.csdn.net/detail/dl10210950/9648528

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值