天天看點

android第三方登陸

實作QQ、微信、新浪微網誌和百度第三方登入(Android Studio)

前言:

對于大多數的APP都有第三方登入這個功能,自己也做過幾次,最近又有一個新項目用到了第三方登入,是以特意總結了一下關于第三方登入的實作,并拿出來與大家一同分享;

各大開放平台注冊賬戶擷取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/

注:

一、關于各大開放平台的開發者使用者注冊和建立應用擷取AppKey、AppSecret我就不多說了,對于大家來說這都so easy;

二、Eclipse在建立應用填寫包名應該是manifest裡面的packpage:

android第三方登陸
studio的則是build.gradle裡面的applicationId:
android第三方登陸
一般情況下,studio的applicationId和manifest下的包名是一緻的,但是applicationId是手動改變的,是以注意在建立應用的時候,要使用applicationId。

新浪微網誌第三方登入實作:

在做新浪微網誌第三方登入的時候,參考他們的api文檔,感覺他們的api文檔寫的特别的亂,并且下載下傳的Demo運作還報錯,以至于浪費了我大半天的時間,去網上搜了幾篇關于第三方登入的文章,寫的并不全,時代也比較久遠,并且基本沒有相關Demo下載下傳,有的就是拷貝的新浪微網誌的開放平台的原文,我也是醉了…..

由于時間比較緊迫,是以并沒有再繼續深究下去。大家應該都知道有許多平台把例如分享、登入等功能內建好了,實作功能十分簡單,這一次我是利用的Mob移動開發平台http://www.mob.com/#/index 實作的新浪微網誌第三方登入,感覺還不錯實作起來比較簡單。

一、下載下傳Mob平台的SDK

首先下載下傳SDK,得到我們需要的資源

SDK位址(http://www.mob.com/#/downloadDetail/ShareSDK/android),下載下傳下來發現無法解壓(你們可以試一下),聯系他們客服,他們說:上傳錯誤,就給我發了一個。我把它和我的Dmeo放在一起,可供下載下傳。

找到ShareSDK for Android包下的QuickIntegrater.jar檔案輕按兩下:

android第三方登陸

感覺還不錯,各大平台都有,隻需要選擇新浪微網誌就可以(我感覺還是沒包裝過的比較好,是以另外三種登入方式沒采用這種方法),解壓之後生成一個Sample檔案:

android第三方登陸

我們需要把裡面的東西全部拿到我們的studio項目中,libs、res和src裡面的全部拷貝複制就可以,studio建立assets的方法和Eclipse不一樣,是以給大家發個圖:

android第三方登陸

點選建立就可以了,再把assets下的ShareSDK.xml拷貝就去;

其次配置ShareSDK

把ShareSDK拷貝進去之後,我們需要把ShareSDK.xml檔案中關于Mob(ShareSDK)和新浪微網誌(SinaWeibo)的Appkey、AppSecret和RedirectUrl替換成我們申請的值,如下圖:

android第三方登陸

把紅箭頭中的ShareSDK中的AppKey換成我們在Mob背景申請的AppKey;

紅框框中的SinaWeibo中的AppKey、AppSecret和RedirectUrl換成我們在新浪微網誌背景申請的對應的值;

RedirectUrl這個字段的值就是我們背景項目中的應用資訊——>進階資訊——>OAuth2.0 授權設定中的授權回調頁這個字段,需要我們填寫一個有效的位址就可以,例如下圖:

android第三方登陸
注:如果RedirectUrl這個字段不填或填寫不對會報以下錯誤:
android第三方登陸

二、配置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>           

二、添加代碼

首先是Mob的授權,在程式的入口處添加授權代碼:

//Mob平台授權
ShareSDK.initSDK(this);           

其次直接調用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; }           

最後登出

Platform mPf = ShareSDK.getPlatform(MainActivity.this, SinaWeibo.NAME);
    //如果要删除授權資訊,重新授權
    ShareSDK.removeCookieOnAuthorize(true); mPf.removeAccount();           

到這裡關于新浪微網誌第三方登入的就基本結束了,我們擷取到了使用者的id、昵稱、頭像位址等資訊,使用唯一值id再結合自己伺服器的接口,便可實作第三方登入了.效果圖如下:

android第三方登陸
android第三方登陸
android第三方登陸

注意:如果你想修改授權的登入頁面,可以參考

這個連結裡面的第11條

QQ第三方登入實作:

注意

一、我不建議大家去看QQ開放平台關于擷取個人資訊那部分的文檔,因為他們的文檔已經過時了,我當時按照文檔做過,但是一直報錯,後來問客服,他告訴我他們的文檔它久遠了,已經不能用了<當時我就醉了、、>,而是給了我一份Demo,我會把Demo放在裡面供大家下載下傳。

二、大家使用的測試機一定要是自動擷取的網絡時間,否則得不到資訊,并且也沒有錯誤資訊,我研究了半天的時間,也沒找到到底為什麼,一問客服才知道,伺服器時間和請求時間戳要相同才可以<我又是醉了、、、>。

三、大家要打包APP再進行測試。

QQ第三方登入的步驟分為:

1.先登入成功擷取token和openid

2.再通過token和openid擷取使用者的資訊。

一、導入SDK的jar檔案

把這兩個jar檔案導入項目中

android第三方登陸

二、配置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第三方登入相關 結束 -->           

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

三、添加代碼

首先在程式入口添加:

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

剩下的調用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第三方登入結束-------------------- */           

代碼有注釋,大家看一下應該很容易明白。

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" }           

最後登出:

mTencent.logout(this);           

給大家看一下截圖:

android第三方登陸

微信第三方登入

微信平台還是做得挺不錯的,大家可以看一下他們的文檔,隻不過我們需要自己寫網絡請求(衰衰衰衰衰)

微信第三方登入分為:

1.擷取code

2.根據code擷取token

3.根據token擷取使用者資訊

在第二、三步需要我們自己去寫網絡請求,我也是醉了。。。。

一、導入SDK的libammsdk.jar檔案,我就不多說了

二、配置AndroidManifest

在你的build.gradle的applicationId相應目錄下建立一個wxapi目錄,在該wxapi目錄下新增一個WXEntryActivity類,該類繼承自Activity(例如應用程式build.gradle的applicationId為com.aohuan.jinghai_lifee,則新添加的類如下圖所示)

android第三方登陸

并在manifest檔案裡面加上exported屬性,設定為true,例如:

<activity
   android:name="com.aohuan.jinghai_lifee.wxapi.WXEntryActivity"
    android:exported="true" android:label="@string/app_name" > </activity>           

三、添加代碼

/** -------------------------微信第三方登入---------------------- */
    /**
     *
     * 微信平台應用授權登入接入代碼示例
     *
     * */
    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); } /** -------------------------微信第三方登入結束-------------------- */           

首先在onCreate()方法裡面調用regToWx()方法實作微信平台的注冊;

其次第一步擷取code

調用getCode()方法發送擷取code的請求,接受code則是在WXEntryActivity這個類裡面的onResp():

android第三方登陸

第二步使用AsyncTask擷取token:

android第三方登陸
/** 微信登入第二步:擷取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); } }           

第三步擷取使用者資訊:

/** 微信登入第三步:擷取使用者資訊 */
    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); } }           

微信第三方登入就結束了,相對來說不算太複雜:

android第三方登陸
注:測試微信登入的時候,也需要打包測試,否則得不到資料;

百度第三方登入

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

第一步:導入Baidu-Frontia-Full-Debug-2.0.6.jar包

android第三方登陸

第二步:配置AndroidManifest.xml

android第三方登陸

添加android:name=”com.baidu.frontia.ForntiaApplication”

第三步:添加代碼

在程式入口初始化Fronta”

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

注冊百度:

//注冊百度
FrontiaAuthorization mAuthorization = Frontia.getAuthorization();           

主要代碼直接調用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"); } } }); }           

登出調用baiduExit()方法就可以:

/**
* 百度第三方退出相關
*/
protected void baiduExit() {
   boolean result = mAuthorization.clearAuthorizationInfo(FrontiaAuthorization.MediaType.BAIDU.toString()); if (result) { mThirdLoginResult.setText("百度退出成功"); } else { mThirdLoginResult.setText("百度退出失敗"); } }           

百度登入,挺簡單的吧

android第三方登陸

1.四種登入方式已經整理好了,如果有什麼地方寫錯了或者漏掉的,請檢視我的Demo或者提出來。

2.由于這是第一次寫部落格,是以肯定有寫的不好的地方,大家有什麼意見可以提出來,互相交流溝通,共同進步。

3.由于我的源代碼裡面涉及到客戶的資訊,是以AppKey、AppSecret等資訊,被我删掉了,如果想看我的Demo效果,需要修改小部分我的代碼:

第一:把我com.aohuan.jinghai_lifee.wxapi換成你的applicationId(對應的包名).wxapi

android第三方登陸
第二:修改ShareSDK.xml裡面對應的資訊:
android第三方登陸
第三:修改manifest.xml裡面對應的資訊:
android第三方登陸
第四:修改AllApk裡面對應的資訊:
android第三方登陸

這樣就可以了!!!

源碼下載下傳位址

GitHub下載下傳位址:

https://github.com/fengmaolian/LoginAndShare

好累,下班回家(哈哈)

轉載于:https://www.cnblogs.com/hexihexi/p/6145141.html