1. 程式人生 > >實現QQ、微信、新浪微博和百度第三方登錄(Android Studio)

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

wiki protocol super cli 路徑 參考 syn jar包 all

前言:
對於大多數的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:
技術分享
studio的則是build.gradle裏面的applicationId
技術分享
一般情況下,studioapplicationIdmanifest下的包名是一致的,但是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文件雙擊:
技術分享
感覺還不錯,各大平臺都有,只需要選擇新浪微博就可以(我感覺還是沒包裝過的比較好,所以另外三種登錄方式沒采用這種方法),解壓之後生成一個Sample文件:
技術分享
我們需要把裏面的東西全部拿到我們的studio項目中,libs、res和src裏面的全部拷貝復制就可以,studio新建assets的方法和Eclipse不一樣,所以給大家發個圖:
技術分享


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

其次配置ShareSDK
把ShareSDK拷貝進去之後,我們需要把ShareSDK.xml文件中關於Mob(ShareSDK)和新浪微博(SinaWeibo)的Appkey、AppSecret和RedirectUrl替換成我們申請的值,如下圖:
技術分享

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

技術分享
註:如果RedirectUrl這個字段不填或填寫不對會報以下錯誤:
技術分享

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

二、添加代碼
首先是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第三方登錄實現:

註意
一、我不建議大家去看QQ開放平臺關於獲取個人信息那部分的文檔,因為他們的文檔已經過時了,我當時按照文檔做過,但是一直報錯,後來問客服,他告訴我他們的文檔它久遠了,已經不能用了<當時我就醉了、、>,而是給了我一份Demo,我會把Demo放在裏面供大家下載。
二、大家使用的測試機一定要是自動獲取的網絡時間,否則得不到信息,並且也沒有錯誤信息,我研究了半天的時間,也沒找到到底為什麽,一問客服才知道,服務器時間和請求時間戳要相同才可以<我又是醉了、、、>。
三、大家要打包APP再進行測試。

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

一、導入SDK的jar文件
把這兩個jar文件導入項目中
技術分享

二、配置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不要刪掉。

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

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獲取用戶信息
在第二、三步需要我們自己去寫網絡請求,我也是醉了。。。。

一、導入SDK的libammsdk.jar文件,我就不多說了
二、配置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

三、添加代碼

/** -------------------------微信第三方登錄---------------------- */
    /**
     *
     * 微信平臺應用授權登錄接入代碼示例
     *
     * */
    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

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