QQ第三方登錄
在Android應用程序的開發過程中,很多時候需要加入用戶登錄/注冊模塊。除了自己動手設計登錄界面並實現相應功能外,現在還可以借助百度、騰訊等開發者平台提供的第三方賬號登錄模塊。最近研究了友盟的社會化分享組件,對其提供的SDK中第三方登錄的QQ模塊進行了測試。本篇文章先對友盟用戶注冊、SDK下載及案例的下載做一個簡單的介紹,然后針對測試程序的過程及代碼進行詳細的描述。
順便提一點,進入友盟的主頁及SDK下載頁面之后,會發現其支持Android、IOS等多個環境下的應用程序開發,感興趣或有這方面需求的小伙伴可以關注下(不是打廣告哦,覺得挺好用)。
一、友盟社會化分享組件集成
在進行自己的應用程序開發之前,需要集成用到的組件,由於本篇文章測試針對第三方QQ登陸,所以選擇的是友盟社會化組件。
其實,友盟社會化分享組件支持絕大多數國內外主流社交平台的分享功能,其中包括:
國內平台:微信(微信好友及微信朋友圈)、QQ、Qzone、新浪微博、騰訊微博、人人網、豆瓣、短信、郵件、有道雲筆記、來往、易信。
國外平台:Facebook、Twitter、Instagram、EverNote、Pocket、Pinterest、Linkedin、G+。
下面的圖片是集成的大致流程:
1、注冊友盟賬號
各個開發者平台都一樣,進行任何操作之前得先注冊,友盟官網:http://www.umeng.com/。
注意,流程圖中的申請第三方賬號這一步驟不是每個應用的開發都需要的,先放着不管。官方解釋是:進行分享、授權操作需要在第三方平台創建應用並提交審核,友盟默認提供了大多數平台的測試賬號,但如果需要將分享、授權來源、分享到QQ、Qzone的icon更改為自己APP的應用,就需要自己申請第三方賬號,並且由於微信平台需要驗證簽名,因此使用微信功能也必須要自行申請賬號。
2、所以,注冊之后,便可以下載SDK了。注意SDK下載時會讓開發者選擇需要的模塊,用到什么就選什么,選擇好后點擊進行下載即可。最終內容為各模塊對應的jar庫文件,程序中加載后可直接調用API方法或接口進行開發。
3、在我的產品頁面添加新應用,獲取到AppKey,結果是一串字符,在以后的開發過程中會用到,可以說非常重要。
二、第三方登錄概述
1、第三方登錄定義
第三方登錄主要用於簡化用戶登錄流程,通過用戶擁有的微博、QQ、微信等第三方賬號進行登錄並且構建APP自己的登錄賬號體系。
2、實現第三方登錄的方法
實現第三方登錄主要通過下面兩步:
在第三方平台完成授權。
獲取第三方平台的accesstoken信息及用戶資料。
3、第三方登錄支持的平台
目前友盟社會化組件支持的第三方登錄平台為:新浪微博、騰訊微博、QQ、QQ空間、微信、人人網、豆瓣。所以,若要利用QQ實現第三方登陸,還需要到騰訊開發者平台(http://open.qq.com/)去登陸,過程同申請上述的AppKey類似,開發者需要創建一個應用,申請一對App ID和App Key,同樣重要。
三、實現QQ登錄
1、 添加相關文件
由於應用開發過程中要用到下載的SDK(*.jar),故第一步是添加對其的引用,以便導入與后續的調用或實現。添加的方式有三種:
A、將platforms/qq_zone/libs中SocialSDK_QQZone_1.jar,SocialSDK_QQZone_2.jar,SocialSDK_QQZone_3.jar拷貝到工程的libs(如果沒有此目錄,新建libs目錄,鼠標右鍵-->Add to Build Path)目錄中。將解壓目錄中platforms/qq_zone/res文件拷貝至你工程res目錄。本文測試就是采用此種方式。
B、雙擊運行SDK根目錄下的SDKIntegration.jar或者在命令行下輸入java -jar SDKIntegration.jar運行集成工具; 2:選擇Android工程的根目錄,並且填寫您的友盟App Key; 3:勾選所需平台和組件,點擊"快速集成"; 4:檢查AndroidManifest.xml、jar文件是否正確。如果集成了QQ或者QZone,請修改相應地appid。該種方法測試時沒有成功,哪位成功了希望告知如何處理,謝謝。
C、將文件夾中的social_sdk_library_project文件夾導入Eclipse,並在您的工程中添加對此項目的引用即可。該方法便於以后的升級,目前沒有進行測試,故不進行描述。
2、Android manifest.xml中添加配置代碼
A、添加上面申請的友盟AppKey:
1 <meta-data 2 android:name="UMENG_APPKEY" 3 android:value=" 55bb0b7367e58ea05f000cf8" > 4 </meta-data>
B、騰訊SSO授權的Activity注冊,有兩個Activity:
1 <activity 2 android:name="com.tencent.tauth.AuthActivity" 3 android:launchMode="singleTask" 4 android:noHistory="true" > 5 <intent-filter> 6 <action android:name="android.intent.action.VIEW" /> 7 <category android:name="android.intent.category.DEFAULT" /> 8 <category android:name="android.intent.category.BROWSABLE" /> 9 <data android:scheme="tencent pqGGpnNOz74m8G6V" /> 10 </intent-filter> 11 </activity> 12 <activity 13 android:name="com.tencent.connect.common.AssistActivity" 14 android:screenOrientation="portrait"
15 android:theme="@android:style/Theme.Translucent.NoTitleBar" />
這里的tencent后面的字串pqGGpnNOz74m8G6V為之前申請的騰訊AppKey,每個開發者均不同。
C、QQ登陸與網絡權限的添加:
1 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 2 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 3 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 4 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 5 <uses-permission android:name="android.permission.INTERNET" /> 6 <uses-permission android:name="android.permission.READ_LOGS" /> 7 <uses-permission android:name="android.permission.CALL_PHONE" /> 8 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 9 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 10 <uses-permission android:name="android.permission.GET_TASKS" /> 11 <uses-permission android:name="android.permission.SET_DEBUG_APP" /> 12 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 13 <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 14 <uses-permission android:name="android.permission.USE_CREDENTIALS" /> 15 <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
3、實現授權及獲取用戶資料
A、添加成員變量mController
在AuthActivityDer類構造函數中添加下面的成員變量:
1 UMSocialService mController = UMServiceFactory.getUMSocialService("com.umeng.login");
B、添加QQ與QQ空間平台
1 private void addQZoneQQPlatform() { 2 String appId = " 1104719081 "; 3 String appKey = " pqGGpnNOz74m8G6V "; 4 UMQQSsoHandler qqSsoHandler = new UMQQSsoHandler(getActivity(), appId, appKey); 5 qqSsoHandler.setTargetUrl("http://www.umeng.com"); 6 qqSsoHandler.addToSocialSDK(); 7 QZoneSsoHandler qZoneSsoHandler = new QZoneSsoHandler(getActivity(), appId, appKey); 8 qZoneSsoHandler.addToSocialSDK(); 9 }
該函數可以在構造函數中添加,也可以在其他調用,只要在真正開始授權登陸之前。
C、授權接口
1 UMSocialService.doOauthVerify(Context context , SHARE_MEDIA platform , UMAuthListener listener);
接口說明:該接口調用將調出授權頁進行授權操作。注意,目前該接口不支持Facebook,twitter,G+,易信,來往授權。是在登陸實現類AuthActivityDer中進行授權(注意,友盟SDK中的QQ登陸模塊名為AuthActivity,盡量別相同,以免混淆)。
在界面上點擊按鈕采用QQ登陸功能后,授權接口的實現內容如下:
1 mController.doOauthVerify(mContext, SHARE_MEDIA.QQ, new UMAuthListener() { 2 @Override 3 public void onStart(SHARE_MEDIA platform) { 4 Toast.makeText(mContext, "授權開始", Toast.LENGTH_SHORT).show(); 5 } 6 @Override 7 public void onError(SocializeException e, SHARE_MEDIA platform) { 8 Toast.makeText(mContext, "授權錯誤", Toast.LENGTH_SHORT).show(); 9 } 10 @Override 11 public void onComplete(Bundle value, SHARE_MEDIA platform) { 12 Toast.makeText(mContext, "授權完成", Toast.LENGTH_SHORT).show(); 13 //獲取用戶信息 14 mController.getPlatformInfo(MainActivity.this, SHARE_MEDIA.QQ, new UMDataListener() { 15 @Override 16 public void onStart() { 17 Toast.makeText(MainActivity.this, "獲取平台數據開始...", Toast.LENGTH_SHORT).show(); 18 } 19 @Override 20 public void onComplete(int status, Map<String, Object> info) { 21 if(status == 200 && info != null){ 22 StringBuilder sb = new StringBuilder(); 23 Set<String> keys = info.keySet(); 24 for(String key : keys){ 25 sb.append(key+"="+info.get(key).toString()+"\r\n"); 26 } 27 Log.d("TestData",sb.toString()); 28 }else{ 29 Log.d("TestData","發生錯誤:"+status); 30 } 31 } 32 }); 33 } 34 @Override 35 public void onCancel(SHARE_MEDIA platform) { 36 Toast.makeText(mContext, "授權取消", Toast.LENGTH_SHORT).show(); 37 } 38 } );
D、上面代碼中調用了用戶信息獲取函數,實現方式如下:
1 private void getUserInfo(SHARE_MEDIA platform) { 2 mController.getPlatformInfo(getActivity(), platform, new UMDataListener() { 3 public void onStart() { 4 ; //此處沒有做任何動作 5 } 6 public void onComplete(int status, Map<String, Object> info) { 7 if (info != null) { 8 Toast.makeText(getActivity(), info.toString(), Toast.LENGTH_SHORT).show(); 9 } 10 } 11 }); 12 }
四、登錄授權圖片
由於代碼中在用戶登錄成功后,只是顯示了用戶的基本信息,所以跳轉后會回到之前的界面。如果在項目中,就可以在該步驟后跳轉到需要打開的界面,如正式的游戲界面等。