Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發實現QQ三方登錄

Android開發實現QQ三方登錄

編輯:關於Android編程

本文分為兩個部分:一是QQ的授權部分;二是獲取用戶的基本信息部分

一、授權部分

1.首先,先去騰訊開放平台獲取APP ID和APP KEY(未注冊騰訊開發者賬號的可能需要先注冊賬號),獲取的過程還是還是非常容易的(不用填寫任何的應用程序信息)。

http://open.qq.com/

\

 

2.下載SDK(http://wiki.open.qq.com/wiki/mobile/SDK%E4%B8%8B%E8%BD%BD)

 

3.下載好SDK後,將其中的兩個jar包(mta-sdk-1.6.2.jar、open_sdk_r5276.jar)引入到工程當中。

 

4.在AndroidManifest.xml的application標簽中添加一下兩個activity。

 


	
	    
		
		
	    
	


 

 

注意:上面中的*****要替換成自己一開始獲取到的APP ID(假設APP ID是123456,則替換後為:scheme="tencent123456")。

 

5.添加訪問網絡的權限。

 



 

6.Java實現:接下來需要兩個對象(布局文件和控件的初始化自行另外解決)

 

//需要騰訊提供的一個Tencent類
    private Tencent mTencent;
    //還需要一個IUiListener 的實現類(LogInListener implements IUiListener)
    private LogInListener mListener;

//首先需要用APP ID 獲取到一個Tencent實例
        mTencent = Tencent.createInstance(QQ_APP_ID, this.getApplicationContext());
        //初始化一個IUiListener對象,在IUiListener接口的回調方法中獲取到有關授權的某些信息
        // (千萬別忘了覆寫onActivityResult方法,否則接收不到回調)
        mListener = new LogInListener();

其中,LogInListener是IUiListener的實現類,其中的回調方法用來接收授權後的相關信息:

 

 

private class LogInListener implements IUiListener {

        @Override
        public void onComplete(Object o) {
            Toast.makeText(MainActivity.this, "授權成功!", Toast.LENGTH_LONG).show();
            System.out.println("o.toString() ------------------------->        " + o.toString());
        }

        @Override
        public void onError(UiError uiError) {

            Toast.makeText(MainActivity.this, "授權出錯!", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onCancel() {
            Toast.makeText(MainActivity.this, "授權取消!", Toast.LENGTH_LONG).show();
        }
    }

注意:別忘了覆寫onActivityResult方法,否則接收不到回調

 

 

//確保能接收到回調
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Tencent.onActivityResultData(requestCode, resultCode, data, mListener);
    }

7.登錄與登出

 

 

//調用QQ登錄,用IUiListener對象作參數(點擊登錄按鈕時執行以下語句)
                    if (!mTencent.isSessionValid()) {
                        mTencent.login(MainActivity.this, "all", mListener);
                    }

//登出比較簡單
                    mTencent.logout(MainActivity.this);

如此整個授權的流程就ok了,我們可以在onComplete回調方法中獲取到授權的信息。


順便提一下,上面IUiListener的onComplete回調方法參數Object對象的格式為:

 

 

{
    "ret": 0,
    "openid": "19E8D43EB75ED256CAC70C02953F188A",
    "access_token": "65A5A933F116085E051F39CAD65084EF",
    "pay_token": "BA387A1679483A4C8585BE268C7C4128",
    "expires_in": 7776000,
    "pf": "desktop_m_qq-10000144-android-2002-",
    "pfkey": "2c7171fb052154f89e9d439e17e18c11",
    "msg": "",
    "login_cost": 442,
    "query_authority_cost": 322,
    "authority_cost": 0
}


二、獲取用戶的基本信息部分。(有用到上一部分onComplete回調方法中傳回來的Object對象)

 

上面只是實現了授權,並未拿到用戶的基本信息,下面是這部分的實現

 

8.在第6步中的onComplete回調方法中添加以下語句

 

@Override
        public void onComplete(Object o) {
            Toast.makeText(MainActivity.this, "授權成功!", Toast.LENGTH_LONG).show();
            System.out.println("o.toString() ------------------------->        " + o.toString());


            JSONObject jsonObject = (JSONObject) o;

            //設置openid和token,否則獲取不到下面的信息
            initOpenidAndToken(jsonObject);
            //獲取QQ用戶的各信息
            getUserInfo();
        }

其中,initOpenidAndToken 與getUserInfo的實現如下

 

 

private void initOpenidAndToken(JSONObject jsonObject) {
        try {
            String openid = jsonObject.getString("openid");
            String token = jsonObject.getString("access_token");
            String expires = jsonObject.getString("expires_in");

            mTencent.setAccessToken(token, expires);
            mTencent.setOpenId(openid);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    private void getUserInfo() {

        //sdk給我們提供了一個類UserInfo,這個類中封裝了QQ用戶的一些信息,我麼可以通過這個類拿到這些信息
        QQToken mQQToken = mTencent.getQQToken();
        UserInfo userInfo = new UserInfo(MainActivity.this, mQQToken);
        userInfo.getUserInfo(new IUiListener() {
                                 @Override
                                 public void onComplete(final Object o) {
                                     JSONObject userInfoJson = (JSONObject) o;
                                     Message msgNick = new Message();
                                     msgNick.what = 0;//昵稱
                                     try {
                                         msgNick.obj = userInfoJson.getString("nickname");//直接傳遞一個昵稱的內容過去
                                     } catch (JSONException e) {
                                         e.printStackTrace();
                                     }
                                     mHandler.sendMessage(msgNick);
                                     //子線程 獲取並傳遞頭像圖片,由Handler更新
                                     new Thread(new Runnable() {
                                         @Override
                                         public void run() {
                                             Bitmap bitmapHead = null;
                                             if (((JSONObject) o).has("figureurl")) {
                                                 try {
                                                     String headUrl = ((JSONObject) o).getString("figureurl_qq_2");
                                                     bitmapHead = Util.getbitmap(headUrl);
                                                 } catch (JSONException e) {
                                                     e.printStackTrace();
                                                 }
                                                 Message msgHead = new Message();
                                                 msgHead.what = 1;
                                                 msgHead.obj = bitmapHead;
                                                 mHandler.sendMessage(msgHead);
                                             }
                                         }
                                     }).start();

                                 }

                                 @Override
                                 public void onError(UiError uiError) {
                                     Log.e("GET_QQ_INFO_ERROR", "獲取qq用戶信息錯誤");
                                     Toast.makeText(MainActivity.this, "獲取qq用戶信息錯誤", Toast.LENGTH_SHORT).show();
                                 }

                                 @Override
                                 public void onCancel() {
                                     Log.e("GET_QQ_INFO_CANCEL", "獲取qq用戶信息取消");
                                     Toast.makeText(MainActivity.this, "獲取qq用戶信息取消", Toast.LENGTH_SHORT).show();
                                 }
                             }
        );
    }

其中,自定義的Util類如下

 

 

public class Util {
    public static String TAG="UTIL";
    public static Bitmap getbitmap(String imageUri) {
        Log.v(TAG, "getbitmap:" + imageUri);
        // 顯示網絡上的圖片
        Bitmap bitmap = null;
        try {
            URL myFileUrl = new URL(imageUri);
            HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
            is.close();

            Log.v(TAG, "image download finished." + imageUri);
        } catch (IOException e) {
            e.printStackTrace();
            Log.v(TAG, "getbitmap bmp fail---");
            return null;
        }
        return bitmap;
    }
}

順便提一下,雖然這裡也是一個IUiListener的回調,但是onComplete的參數o的json數據內容與獲取權限時的那個不一樣,如下:

 

 

{
    "ret": 0,
    "msg": "",
    "is_lost": 0,
    "nickname": "",
    "gender": "",
    "province": "",
    "city": "",
    "figureurl": "",
    "figureurl_1": "",
    "figureurl_2": "",
    "figureurl_qq_1": "",
    "figureurl_qq_2": "",
    "is_yellow_vip": "0",
    "vip": "0",
    "yellow_vip_level": "0",
    "level": "0",
    "is_yellow_year_vip": "0"
}

也可參照官方文檔:http://wiki.open.qq.com/wiki/v3/user/get_info

 

9.Handler部分(這裡我只拿了頭像和昵稱,若要獲得其他信息,對照上面這個json數據取相應的值就可以了)

 

 

//顯示獲取到的頭像和昵稱
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0) {//獲取昵稱
                tvNickName.setText((CharSequence) msg.obj);
            } else if (msg.what == 1) {//獲取頭像
                headerLogo.setImageBitmap((Bitmap) msg.obj);
            }
        }
    };

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved