編輯:關於Android編程
Android 實現QQ第三方登錄
在項目中需要實現QQ第三方登錄,經過一番努力算是寫出來了,現在總結以下,以防以後遺忘,能幫到其他童鞋就更好了。
首先肯定是去下載SDK和DEMO
http://wiki.open.qq.com/wiki/mobile/SDK下載
本文是我自己整合後的簡單DEMO。
先看下效果圖吧
原理:我們要使用QQ登錄我們的應用,不是不用注冊,是我們在後台為用戶注冊了,但是用戶不知道,注冊需要唯一標識,上圖的那串字母與數字的組合就是我們要獲得的唯一標識:OpenID.<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+uPrXxbT6wuvAtMu1sMmhozwvcD4KPHA+ytfPyKOsztLDx9KqvNPU2G9wZW5fc2RrLmphcrrNbXRhLXNkay0xLjAwLmphctXiwb249rzcsPzLs7Hjv7TPws7S19y5stPDtb21xMDgPC9wPgo8cD48aW1nIHNyYz0="/uploadfile/Collfiles/20140910/201409100906079.jpg" alt="\">
其中,AppConstant中是用來放置APPID的,由於考慮到還可能引入其他第三方登錄,為方便管理,故創建此類。Util是根據路徑從網上獲取圖片的處理類
好了進入主題
首先在AndroidManifest.xml中進行兩個定義如果不定義是不行的
然後是兩個權限
接下來是布局文件,activity_main.xml登錄按鈕,獲取頭像、昵稱、openid的textview
然後是MainActivity
public class MainActivity extends Activity implements OnClickListener { TextView openidTextView; TextView nicknameTextView; Button loginButton; ImageView userlogo; private Tencent mTencent; public static QQAuth mQQAuth; public static String mAppid; public static String openidString; public static String nicknameString; public static String TAG="MainActivity"; Bitmap bitmap = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //用來登錄的Button loginButton=(Button)findViewById(R.id.login); loginButton.setOnClickListener(this); //用來顯示OpenID的textView openidTextView=(TextView)findViewById(R.id.user_openid); //用來顯示昵稱的textview nicknameTextView=(TextView)findViewById(R.id.user_nickname); //用來顯示頭像的Imageview userlogo=(ImageView)findViewById(R.id.user_logo); } public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.login: LoginQQ(); break; default: break; } } //這裡是調用QQ登錄的關鍵代碼 public void LoginQQ() { //這裡的APP_ID請換成你應用申請的APP_ID,我這裡使用的是DEMO中官方提供的測試APP_ID 222222 mAppid = AppConstant.APP_ID; //第一個參數就是上面所說的申請的APPID,第二個是全局的Context上下文,這句話實現了調用QQ登錄 mTencent = Tencent.createInstance(mAppid,getApplicationContext()); /**通過這句代碼,SDK實現了QQ的登錄,這個方法有三個參數,第一個參數是context上下文,第二個參數SCOPO 是一個String類型的字符串,表示一些權限 官方文檔中的說明:應用需要獲得哪些API的權限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有權限用“all” 第三個參數,是一個事件監聽器,IUiListener接口的實例,這裡用的是該接口的實現類 */ mTencent.login(MainActivity.this,"all", new BaseUiListener()); } /**當自定義的監聽器實現IUiListener接口後,必須要實現接口的三個方法, * onComplete onCancel onError *分別表示第三方登錄成功,取消 ,錯誤。*/ private class BaseUiListener implements IUiListener { public void onCancel() { // TODO Auto-generated method stub } public void onComplete(Object response) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "登錄成功", 0).show(); try { //獲得的數據是JSON格式的,獲得你想獲得的內容 //如果你不知道你能獲得什麼,看一下下面的LOG Log.e(TAG, "-------------"+response.toString()); openidString = ((JSONObject) response).getString("openid"); openidTextView.setText(openidString); Log.e(TAG, "-------------"+openidString); //access_token= ((JSONObject) response).getString("access_token"); //expires_in = ((JSONObject) response).getString("expires_in"); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } /**到此已經獲得OpneID以及其他你想獲得的內容了 QQ登錄成功了,我們還想獲取一些QQ的基本信息,比如昵稱,頭像什麼的,這個時候怎麼辦? sdk給我們提供了一個類UserInfo,這個類中封裝了QQ用戶的一些信息,我麼可以通過這個類拿到這些信息 如何得到這個UserInfo類呢? */ QQToken qqToken = mTencent.getQQToken(); UserInfo info = new UserInfo(getApplicationContext(), qqToken); //這樣我們就拿到這個類了,之後的操作就跟上面的一樣了,同樣是解析JSON
info.getUserInfo(new IUiListener() { public void onComplete(final Object response) { // TODO Auto-generated method stub Log.e(TAG, "---------------111111"); Message msg = new Message(); msg.obj = response; msg.what = 0; mHandler.sendMessage(msg); Log.e(TAG, "-----111---"+response.toString()); /**由於圖片需要下載所以這裡使用了線程,如果是想獲得其他文字信息直接 * 在mHandler裡進行操作 * */ new Thread(){ @Override public void run() { // TODO Auto-generated method stub JSONObject json = (JSONObject)response; try { bitmap = Util.getbitmap(json.getString("figureurl_qq_2")); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } Message msg = new Message(); msg.obj = bitmap; msg.what = 1; mHandler.sendMessage(msg); } }.start(); } public void onCancel() { Log.e(TAG, "--------------111112"); // TODO Auto-generated method stub } public void onError(UiError arg0) { // TODO Auto-generated method stub Log.e(TAG, "-111113"+":"+arg0); } }); } public void onError(UiError arg0) { // TODO Auto-generated method stub } } Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0) { JSONObject response = (JSONObject) msg.obj; if (response.has("nickname")) { try { nicknameString=response.getString("nickname"); nicknameTextView.setText(nicknameString); Log.e(TAG, "--"+nicknameString); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }else if(msg.what == 1){ Bitmap bitmap = (Bitmap)msg.obj; userlogo.setImageBitmap(bitmap); } } }; }
上圖是登錄Q的返回LOG
上圖是我們獲得騰訊提供的UserInfo返回的LOG
然後是AppConstant.java
public class AppConstant { public static String APP_ID="222222"; }
然後是Util.java
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; } }
至此全部代碼就在這裡了,我們獲得了OpenID這個唯一標識最關鍵的東西,然後看項目中需要登錄的接口還需要什麼信息,獲取到就能實現登陸了。
結束。
代理模式(Proxy)一、 什麼是代理模式先來看看官方的說法,代理模式就是為其他對象提供一種代理,以控制對這個對象的訪問。 看來這個官方的說法的確有點官方,看了還是讓
做IOS開發的都知道,IOS提供了一個具有動態開關效果的UISwitch組件,這個組件很好用效果相對來說也很絢麗,當我們去點擊開關的時候有動畫效果,但遺憾的是Androi
這兩天剛剛接觸Unity3d,之前一直是做android開發,對於Unity3d的開發有專門的人才,我主要涉及在Unity3d與android的交互,經過兩天是實驗終於完
Android的消息機制其實在android的開發過程中指的也就是Handler的運行機制,這也就引出了android中常見的面試問題:簡述Handler、Looper、