Android使用ShareSDK集成QQ侥涵、微信沼撕、微博等第三方登錄

轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/c104fa307c60

前言

第三方登錄幾乎是每個(gè)APP的必須功能宋雏。有些人說(shuō)看官方的文檔實(shí)在讓人眼花繚亂,以前自己第一次做這些功能的時(shí)候也會(huì)遇到很多坑务豺。這里整理了一份比較詳細(xì)的磨总,主要給新手學(xué)習(xí)。有任何問題歡迎提出來(lái)笼沥!

1蚪燕、獲取ShareSDK的AppKey

(照著流程來(lái),很簡(jiǎn)單>赐亍)
http://bbs.mob.com/forum.php?mod=viewthread&tid=8212&extra=page%3D1

2邻薯、下載SDK

下載地址:http://www.mob.com/downloadDetail/ShareSDK/android
下載的時(shí)候一般用默認(rèn)的就足夠了

下載后解壓出來(lái)是這樣的


3、準(zhǔn)備資源

點(diǎn)擊第一個(gè)文件夾乘凸,進(jìn)去如下厕诡,雙擊QuickIntegrater.jar


只需要填寫項(xiàng)目名稱和項(xiàng)目包名即可,其他默認(rèn)营勤。如圖:


點(diǎn)擊確認(rèn)后會(huì)生成如下文件夾灵嫌,如圖:


4、開始集成

1葛作,將上面的文件夾依次粘貼到工程相應(yīng)的文件夾即可寿羞,如圖:

2,在清單文件AndroidManifest.xml添加權(quán)限

<uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <!-- 藍(lán)牙分享所需的權(quán)限 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

3赂蠢,在清單文件AndroidManifest.xml添加activity信息

(注意:tencent后面的appid要保持和您配置的QQ的appid一致)

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

     <intent-filter>
         <data android:scheme="tencent100371282" />
         <action android:name="android.intent.action.VIEW" />
         <category android:name="android.intent.category.BROWSABLE" />
         <category android:name="android.intent.category.DEFAULT" />
     </intent-filter>

    <!-- 調(diào)用新浪原生SDK绪穆,需要注冊(cè)的回調(diào)activity -->
    <intent-filter>
        <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

    <!--集成line客戶端登錄授權(quán),需要添如下格式的過(guò)濾器-->
    <intent-filter> 
    <data android:scheme="line.1477692153" />
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

 </activity>

如果您集成了微信虱岂,還需要添加下面回調(diào)的activity處理玖院;

<activity
     android:name=".wxapi.WXEntryActivity"
     android:theme="@android:style/Theme.Translucent.NoTitleBar"
     android:configChanges="keyboardHidden|orientation|screenSize"
     android:exported="true"
     android:screenOrientation="portrait" /> 

4,在剛剛拷貝進(jìn)去的ShareSDK中替換mob后臺(tái)申請(qǐng)的Appkey與各個(gè)平臺(tái)申請(qǐng)的key

注意:
mob后臺(tái)申請(qǐng)的Appkey:就是第一部中獲取ShareSDK的AppKey
各個(gè)平臺(tái)申請(qǐng)的key:需要到各個(gè)平臺(tái)申請(qǐng),例如需要微信分享第岖,則需要到微信開放平臺(tái)進(jìn)行申請(qǐng)

5难菌,添加登錄代碼

1,在您程序啟動(dòng)的時(shí)候添加初始化代碼(注:不要等調(diào)用ShareSDK功能之前才初始化)
即自己添加一個(gè)類繼承Application蔑滓,在onCreate方法添加下面的代碼郊酒,如下:

package com.xinhao.thirdpartysharelogin;

import android.app.Application;

import cn.sharesdk.framework.ShareSDK;

/**
 * author           Alpha58
 * date             2017/03/15
 * desc             ${Application}
 * <p>
 * upDateAuthor     $Author$
 * upDate           $Date$
 * upDateDesc       ${TODO}
 */
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        //初始化ShareSDK
        ShareSDK.initSDK(this);
    }
}

注意: 該類需要在清單文件中注冊(cè),如圖:


2键袱,登錄activity代碼

package com.xinhao.thirdpartysharelogin;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.mob.tools.utils.UIHandler;

import java.util.HashMap;

import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.sina.weibo.SinaWeibo;
import cn.sharesdk.tencent.qq.QQ;
import cn.sharesdk.wechat.friends.Wechat;

import static android.R.attr.action;


/**
 * author           Alpha58
 * date             2017/03/16
 * desc             ${第三方登錄}
 * <p>
 * upDateAuthor     $Author$
 * upDate           $Date$
 * upDateDesc       ${TODO}
 */
public class LoginActivity extends Activity implements PlatformActionListener, Handler.Callback, View.OnClickListener {

    private static final int MSG_ACTION_CCALLBACK = 0;
    private ImageView ivWxLogin;
    private ImageView ivQqLogin;
    private ImageView ivBlog;
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        initView();
        initListener();
        initData();
    }


    public void initView() {
        ivWxLogin = (ImageView) findViewById(R.id.iv_wx_login);
        ivQqLogin = (ImageView) findViewById(R.id.iv_qq_login);
        ivBlog = (ImageView) findViewById(R.id.iv_blog);
    }


    public void initListener() {
        ivWxLogin.setOnClickListener(this);
        ivQqLogin.setOnClickListener(this);
        ivBlog.setOnClickListener(this);
    }


    public void initData() {

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.iv_wx_login:
                Platform wechat = ShareSDK.getPlatform(Wechat.NAME);
                wechat.setPlatformActionListener(this);
                wechat.SSOSetting(false);
                authorize(wechat, 1);
                break;
            case R.id.iv_qq_login:
                Platform qq = ShareSDK.getPlatform(QQ.NAME);
                qq.setPlatformActionListener(this);
                qq.SSOSetting(false);
                authorize(qq, 2);
                break;
            case R.id.iv_blog:
                Platform sina = ShareSDK.getPlatform(SinaWeibo.NAME);
                sina.setPlatformActionListener(this);
                sina.SSOSetting(false);
                authorize(sina, 3);
                break;
            default:
                break;
        }

    }

    //授權(quán)
    private void authorize(Platform plat, int type) {
        switch (type) {
            case 1:
                showProgressDialog(getString(R.string.opening_wechat));
                break;
            case 2:
                showProgressDialog(getString(R.string.opening_qq));
                break;
            case 3:
                showProgressDialog(getString(R.string.opening_blog));
                break;
        }
        if (plat.isValid()) { //如果授權(quán)就刪除授權(quán)資料
            plat.removeAccount();
        }
        plat.showUser(null);//授權(quán)并獲取用戶信息
    }

    //登陸授權(quán)成功的回調(diào)
    @Override
    public void onComplete(Platform platform, int i, HashMap<String, Object> res) {
        Message msg = new Message();
        msg.what = MSG_ACTION_CCALLBACK;
        msg.arg1 = 1;
        msg.arg2 = action;
        msg.obj = platform;
        UIHandler.sendMessage(msg, this);   //發(fā)送消息

    }

    //登陸授權(quán)錯(cuò)誤的回調(diào)
    @Override
    public void onError(Platform platform, int i, Throwable t) {
        Message msg = new Message();
        msg.what = MSG_ACTION_CCALLBACK;
        msg.arg1 = 2;
        msg.arg2 = action;
        msg.obj = t;
        UIHandler.sendMessage(msg, this);
    }

    //登陸授權(quán)取消的回調(diào)
    @Override
    public void onCancel(Platform platform, int i) {
        Message msg = new Message();
        msg.what = MSG_ACTION_CCALLBACK;
        msg.arg1 = 3;
        msg.arg2 = action;
        msg.obj = platform;
        UIHandler.sendMessage(msg, this);
    }

    //登陸發(fā)送的handle消息在這里處理
    @Override
    public boolean handleMessage(Message message) {
        hideProgressDialog();
        switch (message.arg1) {
            case 1: { // 成功
                Toast.makeText(LoginActivity.this, "授權(quán)登陸成功", Toast.LENGTH_SHORT).show();

                //獲取用戶資料
                Platform platform = (Platform) message.obj;
                String userId = platform.getDb().getUserId();//獲取用戶賬號(hào)
                String userName = platform.getDb().getUserName();//獲取用戶名字
                String userIcon = platform.getDb().getUserIcon();//獲取用戶頭像
                String userGender = platform.getDb().getUserGender(); //獲取用戶性別燎窘,m = 男, f = 女,如果微信沒有設(shè)置性別,默認(rèn)返回null
                Toast.makeText(LoginActivity.this, "用戶信息為--用戶名:" + userName + "  性別:" + userGender, Toast.LENGTH_SHORT).show();

                //下面就可以利用獲取的用戶信息登錄自己的服務(wù)器或者做自己想做的事啦!
                //蹄咖。荠耽。。

            }
            break;
            case 2: { // 失敗
                Toast.makeText(LoginActivity.this, "授權(quán)登陸失敗", Toast.LENGTH_SHORT).show();
            }
            break;
            case 3: { // 取消
                Toast.makeText(LoginActivity.this, "授權(quán)登陸取消", Toast.LENGTH_SHORT).show();
            }
            break;
        }
        return false;
    }

    //顯示dialog
    public void showProgressDialog(String message) {
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage(message);
        progressDialog.setCancelable(true);
        progressDialog.show();
    }

    //隱藏dialog
    public void hideProgressDialog() {
        if (progressDialog != null)
            progressDialog.dismiss();
    }

}

3比藻,布局activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:gravity="center"
              android:orientation="horizontal"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center">

        <ImageView
            android:id="@+id/iv_wx_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="10dp"
            android:clickable="true"
            android:src="@mipmap/wechat_icon"
            />

        <ImageView
            android:id="@+id/iv_qq_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:layout_marginTop="10dp"
            android:clickable="true"
            android:src="@mipmap/qq_icon"
            />

        <ImageView
            android:id="@+id/iv_blog"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="10dp"
            android:clickable="true"
            android:src="@mipmap/blog_icon"
            />


    </LinearLayout>


</LinearLayout>

效果如下:

Demo下載:https://github.com/wildma/ShareSDKThirdPartyShareLogin

如果對(duì)你有幫助記得點(diǎn)贊铝量,star支持下哈~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末倘屹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子慢叨,更是在濱河造成了極大的恐慌纽匙,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拍谐,死亡現(xiàn)場(chǎng)離奇詭異烛缔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)轩拨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門践瓷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人亡蓉,你說(shuō)我怎么就攤上這事晕翠。” “怎么了砍濒?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵淋肾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我爸邢,道長(zhǎng)樊卓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任杠河,我火速辦了婚禮碌尔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘券敌。我一直安慰自己唾戚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布陪白。 她就那樣靜靜地躺著,像睡著了一般膳灶。 火紅的嫁衣襯著肌膚如雪咱士。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天轧钓,我揣著相機(jī)與錄音序厉,去河邊找鬼。 笑死毕箍,一個(gè)胖子當(dāng)著我的面吹牛弛房,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播而柑,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼文捶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荷逞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起粹排,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤种远,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后顽耳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坠敷,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年射富,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膝迎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胰耗,死狀恐怖限次,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宪郊,我是刑警寧澤掂恕,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站弛槐,受9級(jí)特大地震影響懊亡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乎串,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一店枣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叹誉,春花似錦鸯两、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至匠襟,卻和暖如春僻他,著一層夾襖步出監(jiān)牢的瞬間望薄,已是汗流浹背披摄。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工榨为, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啃勉。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓忽舟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叮阅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容