Android之QQ授權登錄獲取用戶信息


有時候我們開發的app須要方便用戶簡單登錄。能夠讓用戶使用自己的qq、微信、微博登錄到我們自己開發的app。

今天就在這里總結一下怎樣在自己的app中集成QQ授權登錄獲取用戶信息的功能。


首先我們打開騰訊開發平台這個網頁,點擊---->移動應用---->創建應用,成功創建應用后。能夠產生我們須要的App ID和App Key,例如以下圖所看到的:



然后我們須要下載Android-SDK-vxxx。下載完后解壓我們能夠得到兩個jar包,和一個樣例代碼。這兩個jar包是我們須要導入到自己app中的,它們的名字是:mta-sdk-1.6.2.jar、open_sdk_r5043.jar。

非常重要的參考資料是站點上提供的API文檔和解壓之后的Sample樣例代碼。


先來看一下demo效果:

      


接着我們開始集成,在AndroidManifest文件里增加下面內容:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.bear.qqlogin.MainActivity"
            android:label="@string/app_name" >
            <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: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" />

                <data android:scheme="1104732758" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
    </application>

在主程序里面實現登錄和獲取用戶信息。主要起作用的語句:

mTencent.login(MainActivity.this, scope, loginListener); //登錄


userInfo = new UserInfo(MainActivity.this, mTencent.getQQToken()); //獲取用戶信息
userInfo.getUserInfo(userInfoListener);


總體代碼例如以下:

import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.Toast;

import com.tencent.connect.UserInfo;
import com.tencent.connect.common.Constants;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;

/**
 * 
 * 通過調用Tencent類的login函數發起登錄/校驗登錄態。

* * 該API具有兩個作用: * (1)假設開發人員沒有調用mTencent實例的setOpenId、setAccessToken API, * 則該API運行正常的登錄操作; * (2)假設開發人員先調用mTencent實例的setOpenId、setAccessToken * API。則該API運行校驗登錄態的操作。假設登錄態有效,則返回成功給應用, * 假設登錄態失效,則會自己主動進入登錄流程,將最新的登錄態數據返回給應用 * * @author super bear * */ public class MainActivity extends Activity { private static final String APPID = "1104732758"; private EditText et1; private EditText et2; private Tencent mTencent; //qq主操作對象 private IUiListener loginListener; //授權登錄監聽器 private IUiListener userInfoListener; //獲取用戶信息監聽器 private String scope; //獲取信息的范圍參數 private UserInfo userInfo; //qq用戶信息 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setupViews(); initData(); } @Override protected void onDestroy() { if (mTencent != null) { //注銷登錄 mTencent.logout(MainActivity.this); } super.onDestroy(); } private void setupViews() { et1 = (EditText) findViewById(R.id.editText1); et2 = (EditText) findViewById(R.id.editText2); findViewById(R.id.button2).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.out.println("你點擊了使用qq登錄按鈕"); login(); } }); findViewById(R.id.button3).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub System.out.println("開始獲取用戶信息"); userInfo = new UserInfo(MainActivity.this, mTencent.getQQToken()); userInfo.getUserInfo(userInfoListener); } }); } private void initData() { //初始化qq主操作對象 mTencent = Tencent.createInstance(APPID, MainActivity.this); //要全部權限,不然會再次申請增量權限,這里不要設置成get_user_info,add_t scope = "all"; loginListener = new IUiListener() { @Override public void onError(UiError arg0) { // TODO Auto-generated method stub } /** * 返回json數據例子 * * {"ret":0,"pay_token":"D3D678728DC580FBCDE15722B72E7365", * "pf":"desktop_m_qq-10000144-android-2002-", * "query_authority_cost":448, * "authority_cost":-136792089, * "openid":"015A22DED93BD15E0E6B0DDB3E59DE2D", * "expires_in":7776000, * "pfkey":"6068ea1c4a716d4141bca0ddb3df1bb9", * "msg":"", * "access_token":"A2455F491478233529D0106D2CE6EB45", * "login_cost":499} */ @Override public void onComplete(Object value) { // TODO Auto-generated method stub System.out.println("有數據返回.."); if (value == null) { return; } try { JSONObject jo = (JSONObject) value; int ret = jo.getInt("ret"); System.out.println("json=" + String.valueOf(jo)); if (ret == 0) { Toast.makeText(MainActivity.this, "登錄成功", Toast.LENGTH_LONG).show(); String openID = jo.getString("openid"); String accessToken = jo.getString("access_token"); String expires = jo.getString("expires_in"); mTencent.setOpenId(openID); mTencent.setAccessToken(accessToken, expires); } } catch (Exception e) { // TODO: handle exception } } @Override public void onCancel() { // TODO Auto-generated method stub } }; userInfoListener = new IUiListener() { @Override public void onError(UiError arg0) { // TODO Auto-generated method stub } /** * 返回用戶信息例子 * * {"is_yellow_year_vip":"0","ret":0, * "figureurl_qq_1":"http:\/\/q.qlogo.cn\/qqapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/40", * "figureurl_qq_2":"http:\/\/q.qlogo.cn\/qqapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/100", * "nickname":"攀爬←蝸牛","yellow_vip_level":"0","is_lost":0,"msg":"", * "city":"黃岡"," * figureurl_1":"http:\/\/qzapp.qlogo.cn\/qzapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/50", * "vip":"0","level":"0", * "figureurl_2":"http:\/\/qzapp.qlogo.cn\/qzapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/100", * "province":"湖北", * "is_yellow_vip":"0","gender":"男", * "figureurl":"http:\/\/qzapp.qlogo.cn\/qzapp\/1104732758\/015A22DED93BD15E0E6B0DDB3E59DE2D\/30"} */ @Override public void onComplete(Object arg0) { // TODO Auto-generated method stub if(arg0 == null){ return; } try { JSONObject jo = (JSONObject) arg0; int ret = jo.getInt("ret"); System.out.println("json=" + String.valueOf(jo)); String nickName = jo.getString("nickname"); String gender = jo.getString("gender"); Toast.makeText(MainActivity.this, "你好。" + nickName, Toast.LENGTH_LONG).show(); } catch (Exception e) { // TODO: handle exception } } @Override public void onCancel() { // TODO Auto-generated method stub } }; } private void login() { //假設session無效。就開始登錄 if (!mTencent.isSessionValid()) { //開始qq授權登錄 mTencent.login(MainActivity.this, scope, loginListener); } } protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == Constants.REQUEST_API) { if (resultCode == Constants.RESULT_LOGIN) { Tencent.handleResultData(data, loginListener); } super.onActivityResult(requestCode, resultCode, data); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }



整個android項目下載鏈接:

QQLoginDemo(QQ授權登錄代碼)



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM