編輯:關於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();
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(); } }
//確保能接收到回調 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Tencent.onActivityResultData(requestCode, resultCode, data, mListener); }
//調用QQ登錄,用IUiListener對象作參數(點擊登錄按鈕時執行以下語句) if (!mTencent.isSessionValid()) { mTencent.login(MainActivity.this, "all", mListener); } //登出比較簡單 mTencent.logout(MainActivity.this);
{ "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(); }
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(); } } ); }
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; } }
{ "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); } } };
最近想寫篇關於Activity啟動過程源碼分析的博客,在此之前先總結下Android中Activity必須要知道的一些基礎知識,以方便後面能看懂Activity的源碼。一
神秘的Android NDK開發往往眾多程序員感到興奮,但又不知它為何物,由於近期開發應用時,為了是開發的.apk文件不被他人解讀(反編譯),查閱了很多資料,其中有提到使
本文實例講述了Android編程滑動效果之倒影效果實現方法。分享給大家供大家參考,具體如下:前面介紹了使用《Android編程實現3D滑動旋轉效果的方法》,現在介紹圖片倒
自己剛學Android的時候在這上面花了不少時間,資料沒少找。學習別人的“關鍵代碼”,自己寫起來不是缺這就是缺那的。希望後來的同學在這上面少浪費些時間。 其實很簡單,就是