實現QQ、微信、新浪微博和百度第三方登陸(Android Studio)

 

前言: 
對於大多數的APP都有第三方登陸這個功能,本身也作過幾回,最近又有一個新項目用到了第三方登陸,因此特地總結了一下關於第三方登陸的實現,並拿出來與你們一同分享;html

各大開放平臺註冊帳戶獲取AppKey和AppSecret 
Mob開放平臺地址:http://www.mob.com/#/index 
QQ開放平臺地址:http://open.qq.com/ 
新浪微博開放平臺地址:http://open.weibo.com/ 
微信開放平臺地址:https://open.weixin.qq.com/ 
百度開放平臺地址:http://apps.bdimg.com/java

注: 
1、關於各大開放平臺的開發者用戶註冊和建立應用獲取AppKey、AppSecret我就很少說了,對於你們來講這都so easy; 
2、Eclipse在建立應用填寫包名應該是manifest裏面的packpage: 
這裏寫圖片描述 
studio的則是build.gradle裏面的applicationId: 
這裏寫圖片描述 
通常狀況下,studioapplicationIdmanifest下的包名是一致的,可是applicationId是手動改變的,因此注意在建立應用的時候,要使用applicationIdandroid

新浪微博第三方登陸實現:git

在作新浪微博第三方登陸的時候,參考他們的api文檔,感受他們的api文檔寫的特別的亂,而且下載的Demo運行還報錯,以致於浪費了我大半天的時間,去網上搜了幾篇關於第三方登陸的文章,寫的並不全,時代也比較久遠,而且基本沒有相關Demo下載,有的就是拷貝的新浪微博的開放平臺的原文,我也是醉了….. 
因爲時間比較緊迫,因此並無再繼續深究下去。你們應該都知道有許多平臺把例如分享、登陸等功能集成好了,實現功能十分簡單,這一次我是利用的Mob移動開發平臺http://www.mob.com/#/index 實現的新浪微博第三方登陸,感受還不錯實現起來比較簡單。github

1、下載Mob平臺的SDK 
首先下載SDK,獲得咱們須要的資源json

SDK地址(http://www.mob.com/#/downloadDetail/ShareSDK/android),下載下來發現沒法解壓(大家能夠試一下),聯繫他們客服,他們說:上傳錯誤,就給我發了一個。我把它和個人Dmeo放在一塊兒,可供下載。 
找到ShareSDK for Android包下的QuickIntegrater.jar文件雙擊: 
這裏寫圖片描述 
感受還不錯,各大平臺都有,只須要選擇新浪微博就能夠(我感受仍是沒包裝過的比較好,因此另外三種登陸方式沒采用這種方法),解壓以後生成一個Sample文件: 
這裏寫圖片描述 
咱們須要把裏面的東西所有拿到咱們的studio項目中,libs、res和src裏面的所有拷貝複製就能夠,studio新建assets的方法和Eclipse不同,因此給你們發個圖: 
這裏寫圖片描述 
點擊建立就能夠了,再把assets下的ShareSDK.xml拷貝就去;api

其次配置ShareSDK 
把ShareSDK拷貝進去以後,咱們須要把ShareSDK.xml文件中關於Mob(ShareSDK)和新浪微博(SinaWeibo)的Appkey、AppSecret和RedirectUrl替換成咱們申請的值,以下圖: 
這裏寫圖片描述android-studio

把紅箭頭中的ShareSDK中的AppKey換成咱們在Mob後臺申請的AppKey; 
紅框框中的SinaWeibo中的AppKey、AppSecret和RedirectUrl換成咱們在新浪微博後臺申請的對應的值; 
RedirectUrl這個字段的值就是咱們後臺項目中的應用信息——>高級信息——>OAuth2.0 受權設置中的受權回調頁這個字段,須要咱們填寫一個有效的地址就能夠,例以下圖:服務器

這裏寫圖片描述 
注:若是RedirectUrl這個字段不填或填寫不對會報如下錯誤: 
這裏寫圖片描述微信

2、配置AndroidManifest.xml 
添加activity信息

<activity android:name="com.mob.tools.MobUIShell" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden|adjustResize" > </activity>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2、添加代碼 
首先是Mob的受權,在程序的入口處添加受權代碼:

//Mob平臺受權 ShareSDK.initSDK(this);
  • 1
  • 2
  • 1
  • 2

其次直接調用thirdSinaLogin()方法就能夠了:

//-----------------------------------------------------新浪微博受權相關-------------- /** 新浪微博受權、獲取用戶信息頁面 */ private void thirdSinaLogin() { //初始化新浪平臺 Platform pf = ShareSDK.getPlatform(MainActivity.this, SinaWeibo.NAME); pf.SSOSetting(true); //設置監聽 pf.setPlatformActionListener(MainActivity.this); //獲取登錄用戶的信息,若是沒有受權,會先受權,而後獲取用戶信息 pf.authorize(); } /** 新浪微博受權成功回調頁面 */ @Override public void onComplete(Platform platform, int action, HashMap<String, Object> hashMap) { /** res是返回的數據,例如showUser(null),返回用戶信息,對其解析就行 * http://sharesdk.cn/androidDoc/cn/sharesdk/framework/PlatformActionListener.html * */ Message msg = new Message(); msg.what = MSG_ACTION_CCALLBACK; msg.arg1 = 1; msg.arg2 = action; msg.obj = platform; UIHandler.sendMessage(msg, this); } /** 取消受權 */ @Override public void onCancel(Platform platform, int action) { Message msg = new Message(); msg.what = MSG_ACTION_CCALLBACK; msg.arg1 = 3; msg.arg2 = action; msg.obj = platform; UIHandler.sendMessage(msg, this); } /** 受權失敗 */ @Override public void onError(Platform platform, int action, Throwable t) { t.printStackTrace(); t.getMessage(); Message msg = new Message(); msg.what = MSG_ACTION_CCALLBACK; msg.arg1 = 2; msg.arg2 = action; msg.obj = t; UIHandler.sendMessage(msg, this); } @Override public boolean handleMessage(Message msg) { switch(msg.what) { case MSG_TOAST: { String text = String.valueOf(msg.obj); Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show(); } break; case MSG_ACTION_CCALLBACK: { switch (msg.arg1) { case 1: { // 成功, successful notification //受權成功後,獲取用戶信息,要本身解析,看看oncomplete裏面的註釋 //ShareSDK只保存如下這幾個通用值 Platform pf = ShareSDK.getPlatform(MainActivity.this, SinaWeibo.NAME); Log.e("sharesdk use_id", pf.getDb().getUserId()); //獲取用戶id Log.e("sharesdk use_name", pf.getDb().getUserName());//獲取用戶名稱 Log.e("sharesdk use_icon", pf.getDb().getUserIcon());//獲取用戶頭像 mThirdLoginResult.setText("受權成功"+"\n"+"用戶id:" + pf.getDb().getUserId() + "\n" + "獲取用戶名稱" + pf.getDb().getUserName() + "\n" + "獲取用戶頭像" + pf.getDb().getUserIcon()); //mPf.author()這個方法每一次都會調用受權,出現受權界面 //若是要刪除受權信息,從新受權 //mPf.getDb().removeAccount(); //調用後,用戶就得從新受權,不然下一次就不用受權 } break; case 2: { mThirdLoginResult.setText("登陸失敗"); } break; case 3: { // 取消, cancel notification mThirdLoginResult.setText("取消受權"); } break; } } break; case MSG_CANCEL_NOTIFY: { NotificationManager nm = (NotificationManager) msg.obj; if (nm != null) { nm.cancel(msg.arg1); } } break; } return false; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95

最後退出登陸

Platform mPf = ShareSDK.getPlatform(MainActivity.this, SinaWeibo.NAME); //若是要刪除受權信息,從新受權 ShareSDK.removeCookieOnAuthorize(true); mPf.removeAccount();
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

到這裏關於新浪微博第三方登陸的就基本結束了,咱們獲取到了用戶的id、暱稱、頭像地址等信息,使用惟一值id再結合本身服務器的接口,即可實現第三方登陸了.效果圖以下: 
這裏寫圖片描述 
這裏寫圖片描述 
這裏寫圖片描述

注意:若是你想修改受權的登陸頁面,能夠參考 
這個連接裏面的第11條

QQ第三方登陸實現:

注意 
1、我不建議你們去看QQ開放平臺關於獲取我的信息那部分的文檔,由於他們的文檔已通過時了,我當時按照文檔作過,可是一直報錯,後來問客服,他告訴我他們的文檔它久遠了,已經不能用了<當時我就醉了、、>,而是給了我一份Demo,我會把Demo放在裏面供你們下載。 
2、你們使用的測試機必定要是自動獲取的網絡時間,不然得不到信息,而且也沒有錯誤信息,我研究了半天的時間,也沒找到到底爲何,一問客服才知道,服務器時間和請求時間戳要相同才能夠<我又是醉了、、、>。 
3、你們要打包APP再進行測試。

QQ第三方登陸的步驟分爲: 
1.先登陸成功獲取token和openid 
2.再經過token和openid獲取用戶的信息。

1、導入SDK的jar文件 
把這兩個jar文件導入項目中 
這裏寫圖片描述

2、配置AndroidManifest

<!-- QQ第三方登陸相關 開始 --> <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="tencent你的APPId" /> </intent-filter> </activity> <activity android:name="com.tencent.connect.common.AssistActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="orientation|keyboardHidden|screenSize" /> <!-- QQ第三方登陸相關 結束 -->
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

scheme這個字段輸入你申請的appid,tencent不要刪掉。

3、添加代碼 
首先在程序入口添加:

Tencent mTencent = Tencent.createInstance(你的AppId, this.getApplicationContext());
  • 1
  • 1

剩下的調用loginQQ方法即可以:

/** ------------------------QQ第三方登陸-------------------- */ public void loginQQ(){ /** 判斷是否登錄過 */ if (!mTencent.isSessionValid()){ mTencent.login(this, "all",loginListener); }/** 登錄過註銷以後在登陸 */ else { mTencent.logout(this); mTencent.login(this, "all",loginListener); } } IUiListener loginListener = new BaseUiListener() { @Override protected void doComplete(JSONObject values) { initOpenidAndToken(values); updateUserInfo(); } }; /** QQ登陸第二步:存儲token和openid */ public static void initOpenidAndToken(JSONObject jsonObject) { try { String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN); String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN); String openId = jsonObject.getString(Constants.PARAM_OPEN_ID); if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires) && !TextUtils.isEmpty(openId)) { mTencent.setAccessToken(token, expires); mTencent.setOpenId(openId); } } catch(Exception e) { } } /** QQ登陸第三步:獲取用戶信息 */ private void updateUserInfo() { if (mTencent != null && mTencent.isSessionValid()) { IUiListener listener = new IUiListener() { @Override public void onError(UiError e) { Message msg = new Message(); msg.obj = "把手機時間改爲獲取網絡時間"; msg.what = 1; mHandler.sendMessage(msg); } @Override public void onComplete(final Object response) { Message msg = new Message(); msg.obj = response; msg.what = 0; mHandler.sendMessage(msg); } @Override public void onCancel() { Message msg = new Message(); msg.obj = "獲取用戶信息失敗"; msg.what = 2; mHandler.sendMessage(msg); } }; mInfo = new UserInfo(this, mTencent.getQQToken()); mInfo.getUserInfo(listener); } else { } } Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { /** 獲取用戶信息成功 */ if (msg.what == 0) { JSONObject response = (JSONObject) msg.obj; if (response.has("nickname")) { try { log("獲取用戶信息成功,返回結果:"+response.toString()); mThirdLoginResult.setText("登陸成功\n"+"用戶id:"+openid+"\n暱稱:"+response.getString("nickname")+"\n頭像地址:"+response.get("figureurl_qq_1")); } catch (JSONException e) { e.printStackTrace(); } } }else if(msg.what == 1){ mThirdLoginResult.setText(msg+""); }else if(msg.what == 2){ mThirdLoginResult.setText(msg+""); } } }; /** QQ登陸第一步:獲取token和openid */ private class BaseUiListener implements IUiListener { @Override public void onComplete(Object response) { if (null == response) { mToast("登陸失敗"); return; } JSONObject jsonResponse = (JSONObject) response; if (null != jsonResponse && jsonResponse.length() == 0) { mToast("登陸失敗"); return; } log("QQ登陸成功返回結果-" + response.toString()); doComplete((JSONObject)response); } protected void doComplete(JSONObject response) {} @Override public void onError(UiError e) { Util.toastMessage(MainActivity.this, "onError: " + e.errorDetail); Util.dismissDialog(); } @Override public void onCancel() { Util.toastMessage(MainActivity.this, "onCancel: "); Util.dismissDialog(); if (isServerSideLogin) { isServerSideLogin = false; } } } /** -------------------------QQ第三方登陸結束-------------------- */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118

代碼有註釋,你們看一下應該很容易明白。

QQ能夠得到如下相關信息: 
你們只要response.getString(「字段名」)就能夠獲得數據了:

{
    "is_yellow_year_vip": "0", "ret": 0, "figureurl_qq_1": "http://q.qlogo.cn/qqapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/40", "figureurl_qq_2": "http://q.qlogo.cn/qqapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/100", "nickname": "小羅", "yellow_vip_level": "0", "msg": "", "figureurl_1": "http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/50", "vip": "0", "level": "0", "figureurl_2": "http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/100", "is_yellow_vip": "0", "gender": "男", "figureurl": "http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/30" }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

最後退出登陸:

mTencent.logout(this);
  • 1
  • 1

給你們看一下截圖: 
這裏寫圖片描述

微信第三方登陸 
微信平臺仍是作得挺不錯的,你們能夠看一下他們的文檔,只不過咱們須要本身寫網絡請求(衰衰衰衰衰)

微信第三方登陸分爲: 
1.獲取code 
2.根據code獲取token 
3.根據token獲取用戶信息 
在第2、三步須要咱們本身去寫網絡請求,我也是醉了。。。。

1、導入SDK的libammsdk.jar文件,我就很少說了 
2、配置AndroidManifest 
在你的build.gradle的applicationId相應目錄下新建一個wxapi目錄,在該wxapi目錄下新增一個WXEntryActivity類,該類繼承自Activity(例如應用程序build.gradle的applicationId爲com.aohuan.jinghai_lifee,則新添加的類以下圖所示) 
這裏寫圖片描述 
並在manifest文件裏面加上exported屬性,設置爲true,例如:

<activity android:name="com.aohuan.jinghai_lifee.wxapi.WXEntryActivity" android:exported="true" android:label="@string/app_name" > </activity>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

3、添加代碼

/** -------------------------微信第三方登陸---------------------- */ /** * * 微信平臺應用受權登陸接入代碼示例 * * */ private void regToWx(){ // 經過WXAPIFactory工廠,得到IWXAPI的實例 api = WXAPIFactory.createWXAPI(MainActivity.this, AllApk.WEIXIN_APP_ID, true); // 將應用的appid註冊到微信 api.registerApp(AllApk.WEIXIN_APP_ID); } //獲取微信訪問getCode private void getCode(){ final SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "carjob_wx_login"; api.sendReq(req); } /** -------------------------微信第三方登陸結束-------------------- */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

首先在onCreate()方法裏面調用regToWx()方法實現微信平臺的註冊; 
其次第一步獲取code 
調用getCode()方法發送獲取code的請求,接受code則是在WXEntryActivity這個類裏面的onResp(): 
這裏寫圖片描述

第二步使用AsyncTask獲取token: 
這裏寫圖片描述

/** 微信登陸第二步:獲取token */ class AsynctaskToken extends AsyncTask<Object , Object , Object> { @Override protected Object doInBackground(Object... params) { HttpGet httpRequest = new HttpGet(params[0].toString()); try{ HttpClient httpClient = new DefaultHttpClient(); HttpResponse httpResponse = httpClient.execute(httpRequest); if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ BaseActivity.log("請求我的信息成功"); String strResult = EntityUtils.toString(httpResponse.getEntity()); return strResult; } else{ BaseActivity.log("請求我的信息失敗"); return "請求出錯"; } } catch(ClientProtocolException e){ } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onCancelled() { super.onCancelled(); } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); Object obj = null; try { obj = JsonUtil.toObjectByJson(o.toString(), WeiXinLoginGetTokenBean.class); } catch (IOException e) { e.printStackTrace(); } WeiXinLoginGetTokenBean bean = (WeiXinLoginGetTokenBean)obj; BaseActivity.log("獲取token成功:\n" + "token:"+bean.getAccess_token()+"\nopenid"+bean.getOpenid()); String url = "https://api.weixin.qq.com/sns/userinfo?"+"access_token="+bean.getAccess_token()+"&openid="+bean.getOpenid(); new AsynctaskInfo().execute(url); } @Override protected void onProgressUpdate(Object... values) { super.onProgressUpdate(values); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

第三步獲取用戶信息:

/** 微信登陸第三步:獲取用戶信息 */ class AsynctaskInfo extends AsyncTask<Object , Object , Object> { @Override protected Object doInBackground(Object... params) { HttpGet httpRequest = new HttpGet(params[0].toString()); try{ HttpClient httpClient = new DefaultHttpClient(); HttpResponse httpResponse = httpClient.execute(httpRequest); if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ BaseActivity.log("請求我的信息成功"); String strResult = EntityUtils.toString(httpResponse.getEntity()); return strResult; } else{ BaseActivity.log("請求我的信息失敗"); return "請求出錯"; } } catch(ClientProtocolException e){ } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onCancelled() { super.onCancelled(); } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); Object obj = null; try { obj = JsonUtil.toObjectByJson(o.toString(), WeiXinLoginGetUserinfoBean.class); } catch (IOException e) { e.printStackTrace(); } WeiXinLoginGetUserinfoBean bean = (WeiXinLoginGetUserinfoBean)obj; BaseActivity.log("獲取用戶信息成功:\n" + "暱稱:"+bean.getNickname()+"\n頭像路徑"+bean.getHeadimgurl()); Toast.makeText(mContext,"獲取用戶信息成功:\n"+"暱稱:"+bean.getNickname() + "\n頭像路徑:"+bean.getHeadimgurl(),Toast.LENGTH_LONG).show(); finish(); } @Override protected void onProgressUpdate(Object... values) { super.onProgressUpdate(values); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

微信第三方登陸就結束了,相對來講不算太複雜: 
這裏寫圖片描述

注:測試微信登陸的時候,也須要打包測試,不然得不到數據;

百度第三方登陸 
百度第三方登陸,相對來講就比較簡單了

第一步:導入Baidu-Frontia-Full-Debug-2.0.6.jar包 
這裏寫圖片描述

第二步:配置AndroidManifest.xml 
這裏寫圖片描述 
添加android:name=」com.baidu.frontia.ForntiaApplication」

第三步:添加代碼 
在程序入口初始化Fronta」

Frontia.init(this.getApplicationContext(),你的AppKey);
  • 1
  • 1

註冊百度:

//註冊百度 FrontiaAuthorization mAuthorization = Frontia.getAuthorization();
  • 1
  • 2
  • 1
  • 2

主要代碼直接調用baiduLogin()方法就能夠:

/** * 百度第三方登陸相關 */ protected void baiduLogin() { ArrayList<String> scope = new ArrayList<String>(); scope.add(Scope_Basic); scope.add(Scope_Netdisk); mAuthorization.authorize(this, FrontiaAuthorization.MediaType.BAIDU.toString(), scope, new FrontiaAuthorizationListener.AuthorizationListener() { @Override public void onSuccess(FrontiaUser result) { if (null != mThirdLoginResult) { mThirdLoginResult.setText("social id: " + result.getId() + "\n" + "token: " + result.getAccessToken() + "\n" + "expired: " + result.getExpiresIn()); } } @Override public void onFailure(int errCode, String errMsg) { if (null != mThirdLoginResult) { mThirdLoginResult.setText("errCode:" + errCode + ", errMsg:" + errMsg); } } @Override public void onCancel() { if (null != mThirdLoginResult) { mThirdLoginResult.setText("cancel"); } } }); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

退出登陸調用baiduExit()方法就能夠:

/** * 百度第三方退出相關 */ protected void baiduExit() { boolean result = mAuthorization.clearAuthorizationInfo(FrontiaAuthorization.MediaType.BAIDU.toString()); if (result) { mThirdLoginResult.setText("百度退出成功"); } else { mThirdLoginResult.setText("百度退出失敗"); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

百度登陸,挺簡單的吧 
這裏寫圖片描述

1.四種登陸方式已經整理好了,若是有什麼地方寫錯了或者漏掉的,請查看個人Demo或者提出來。 
2.因爲這是第一次寫博客,因此確定有寫的很差的地方,你們有什麼意見能夠提出來,相互交流溝通,共同進步。 
3.因爲個人源代碼裏面涉及到客戶的信息,因此AppKey、AppSecret等信息,被我刪掉了,若是想看個人Demo效果,須要修改小部分個人代碼: 
第一:把我com.aohuan.jinghai_lifee.wxapi換成你的applicationId(對應的包名).wxapi 
這裏寫圖片描述 
第二:修改ShareSDK.xml裏面對應的信息: 
這裏寫圖片描述 
第三:修改manifest.xml裏面對應的信息: 
這裏寫圖片描述 
第四:修改AllApk裏面對應的信息: 
這裏寫圖片描述 
這樣就能夠了!!!

源碼下載地址 
GitHub下載地址: 
https://github.com/fengmaolian/LoginAndShare

相關文章
相關標籤/搜索