Android ShareSDK第三方登入(分別有新浪、QQ、微信、Facebook、Linkedin、Google等等)
專案的Demo:
快速整合:
1. 獲取ShareSDK的AppKey
2. 下載SDK
下載頁如圖所示:點選下載之後如下圖所以,點選下載SDK的下載頁,展開平臺可以選擇其他的第三方平臺;demo也是這裡下載;下載完之後的解壓目錄如圖所示:3. 快速整合
ShareSDK深受大家喜愛,看下親愛的使用者做的詳細說明:Studio整合
第一步:使快速工具進行整合(檢視視訊教程)
進入ShareSDK解壓目錄,開啟“Share SDK for Android”目錄,可以找到“QuickIntegrater.jar”,這個就是快速整合ShareSDK的工具
Windows下
首先確定您已經安裝了JDK,並且正確配置了JAVA_HOME和PATH系統變數,此時您可以雙擊QuickIntegrater啟動程式
Linux/Mac OS下
同樣需要先確保已經正確配置了JDK,之後啟動終端,cd進入“Share SDK for Android”目錄,輸入: java -jar QuickIntegrater.jar 可啟動QuickIntegrater
正確輸入專案的名稱和包名,勾選需要的整合的平臺,然後點選“確定”。
QuickIntegrater會自行產生一個資料夾,複製此資料夾中所有檔案到您的專案中覆蓋即可。
第二步:配置AndroidManifest.xml(檢視視訊教程)
下面清單檔案的配置是全部的,沒有的平臺就是不需要配置
1、新增許可權
<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"/> <!-- 藍芽分享所需的許可權 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />123456789101112 | <uses-permissionandroid:name="android.permission.GET_TASKS"/><uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission |
2、新增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> <!-- 呼叫新浪原生SDK,需要註冊的回撥activity --> <intent-filter> <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>1234567891011121314151617181920 | <activityandroid: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"/><actionandroid:name="android.intent.action.VIEW"/><category android:name="android.intent.category.BROWSABLE"/><categoryandroid:name="android.intent.category.DEFAULT"/></intent-filter><!--呼叫新浪原生SDK,需要註冊的回撥activity--><intent-filter><actionandroid:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY"/><categoryandroid:name="android.intent.category.DEFAULT"/></intent-filter></activity> |
3、如果您集成了微信,易信,新浪微博支付寶還需要新增下面回撥的activity處理;
<!--微信分享回撥 --> <activity android:name=".wxapi.WXEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" /> <!--易信分享回撥 --> <activity android:name=".yxapi.YXEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" /> <!-- 支付寶分享回撥 --> <activity android:name=".apshare.ShareEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true"/>12345678910111213141516171819202122 | <!--微信分享回撥--><activityandroid:name=".wxapi.WXEntryActivity"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:configChanges="keyboardHidden|orientation|screenSize"android:exported="true"android:screenOrientation="portrait"/><!--易信分享回撥--><activityandroid:name=".yxapi.YXEntryActivity"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:configChanges="keyboardHidden|orientation|screenSize"android:exported="true"android:screenOrientation="portrait"/><!--支付寶分享回撥--><activityandroid:name=".apshare.ShareEntryActivity"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:configChanges="keyboardHidden|orientation|screenSize"android:exported="true"/> |
4、替換mob後臺申請的Appkey與各個平臺申請的key
第三步:新增分享程式碼(檢視視訊教程)
在您的程式碼中呼叫此方法,即可開啟一鍵分享功能進行分享
private void showShare() { ShareSDK.initSDK(this); OnekeyShare oks = new OnekeyShare(); //關閉sso授權 oks.disableSSOWhenAuthorize(); // 分享時Notification的圖示和文字 2.5.9以後的版本不呼叫此方法 //oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name)); // title標題,印象筆記、郵箱、資訊、微信、人人網和QQ空間使用 oks.setTitle(getString(R.string.share)); // titleUrl是標題的網路連結,僅在人人網和QQ空間使用 oks.setTitleUrl("http://sharesdk.cn"); // text是分享文字,所有平臺都需要這個欄位 oks.setText("我是分享文字"); // imagePath是圖片的本地路徑,Linked-In以外的平臺都支援此引數 //oks.setImagePath("/sdcard/test.jpg");//確保SDcard下面存在此張圖片 // url僅在微信(包括好友和朋友圈)中使用 oks.setUrl("http://sharesdk.cn"); // comment是我對這條分享的評論,僅在人人網和QQ空間使用 oks.setComment("我是測試評論文字"); // site是分享此內容的網站名稱,僅在QQ空間使用 oks.setSite(getString(R.string.app_name)); // siteUrl是分享此內容的網站地址,僅在QQ空間使用 oks.setSiteUrl("http://sharesdk.cn"); // 啟動分享GUI oks.show(this); }12345678910111213141516171819202122232425262728 | privatevoidshowShare(){ShareSDK.initSDK(this);OnekeyShareoks=newOnekeyShare();//關閉sso授權oks.disableSSOWhenAuthorize();// 分享時Notification的圖示和文字 2.5.9以後的版本不呼叫此方法//oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));// title標題,印象筆記、郵箱、資訊、微信、人人網和QQ空間使用oks.setTitle(getString(R.string.share));// titleUrl是標題的網路連結,僅在人人網和QQ空間使用oks.setTitleUrl("http://sharesdk.cn");// text是分享文字,所有平臺都需要這個欄位oks.setText("我是分享文字");// imagePath是圖片的本地路徑,Linked-In以外的平臺都支援此引數//oks.setImagePath("/sdcard/test.jpg");//確保SDcard下面存在此張圖片// url僅在微信(包括好友和朋友圈)中使用oks.setUrl("http://sharesdk.cn");// comment是我對這條分享的評論,僅在人人網和QQ空間使用oks.setComment("我是測試評論文字");// site是分享此內容的網站名稱,僅在QQ空間使用oks.setSite(getString(R.string.app_name));// siteUrl是分享此內容的網站地址,僅在QQ空間使用oks.setSiteUrl("http://sharesdk.cn");// 啟動分享GUIoks.show(this);} |
執行效果如下:
編譯並執行後,彈出類似上圖的分享列表選擇頁面,點選後彈出分享視窗,點擊發表後就成功傳送到社交平臺的話說明你已經基本整合成功了。
第四步:高階自定義功能
如果上述文件不能滿足你的分享需求,請參看高階自定義功能。
第三方登入:
1、Android 授權以及授權頁面自定義
ShareSDK的授權分為“手動授權”和“自動授權”。前者是指顯式呼叫ShareSDK的授權程式碼來執行授權操作,後者是執行ShareSDK的操作前不考慮具體平臺是否已經完成授權操作,直接呼叫其對應方法執行操作(如分享操作),ShareSDK內部會根據平臺數據庫中的資料判斷其是否已經完成授權,若是未授權或授權資訊已經失效,則自行啟動授權流程,執行授權。自動授權於開發者是透明的,但是於使用者來說依然存在。
不管您選擇的是“手動授權”還是“自動授權”,授權都是您接觸ShareSDK的第一個操作。
對於大部分的應用來說,手動授權是沒有必要的,但是如果您只是想做一個“賬號系統”,或者是說您的應用不需要註冊,只需要是微博的使用者,就能登入,那麼這個方法還是十分有用途的。
2、手動授權
下面是新浪微博授權操作的例子:
Platform weibo = ShareSDK.getPlatform(SinaWeibo.NAME); weibo.setPlatformActionListener(paListener); weibo.authorize(); //移除授權 //weibo.removeAccount(true);12345 | Platformweibo=ShareSDK.getPlatform(SinaWeibo.NAME);weibo.setPlatformActionListener(paListener);weibo.authorize();//移除授權//weibo.removeAccount(true); |
呼叫authorize方法,會彈出一個基於ShareSDKUIShell的授權頁面,填寫賬號和密碼以後,會執行授權操作。這個方法的操作回撥paListener並不實際帶回什麼資料,只是通過回撥告知外部成功或者失敗。但是每一個平臺都具備一個PlatformDb的成員,這裡面儲存了此平臺的授權資訊。可以參考如下章節7的平臺數據庫的操作的說明或檢視獲取授權使用者資料章節,通過方法getToken、getUserId等方法,獲取授權使用者在此平臺上的授權資訊。並由此建立“賬戶系統”。
以上是授權新浪微博的例子,如果想授權其他的第三方平臺,只需要通過修改平臺的名稱。
Platform qq = ShareSDK.getPlatform(QQ.NAME);1 | Platformqq=ShareSDK.getPlatform(QQ.NAME); |
平臺的名稱可以在assets下shareSDK.xml檔案裡面對應獲取找到。如下所示:SinaWeibo、QZone等
<ShareSDK AppKey = "androidv1101"/> <!-- 修改成你在sharesdk後臺註冊的應用的appkey"--> <!-- ShareByAppClient標識是否使用微部落格戶端分享,預設是false --> <SinaWeibo Id="1" SortId="1" AppKey="568898243" AppSecret="38a4f8204cc784f81f9f0daaf31e02e3" RedirectUrl="http://www.sharesdk.cn" ShareByAppClient="false" Enable="true" /> <TencentWeibo Id="2" SortId="2" AppKey="801307650" AppSecret="ae36f4ee3946e1cbb98d6965b0b2ff5c" RedirectUri="http://sharesdk.cn" Enable="true" /> <!-- ShareByAppClient標識是否使用微部落格戶端分享,預設是false --> <QZone Id="3" SortId="3" AppId="100371282" AppKey="aed9b0303e3ed1e27bae87c33761161d" ShareByAppClient="true" Enable="true" />1234567891011121314151617181920212223242526272829 | <ShareSDKAppKey="androidv1101"/><!--修改成你在sharesdk後臺註冊的應用的appkey"--> <!-- ShareByAppClient標識是否使用微部落格戶端分享,預設是false --> <SinaWeibo Id="1" SortId="1" AppKey="568898243" AppSecret="38a4f8204cc784f81f9f0daaf31e02e3" RedirectUrl="http://www.sharesdk.cn"ShareByAppClient="false"Enable="true"/><TencentWeiboId="2"SortId="2"AppKey="801307650"AppSecret="ae36f4ee3946e1cbb98d6965b0b2ff5c"RedirectUri="http://sharesdk.cn"Enable="true"/><!--ShareByAppClient標識是否使用微部落格戶端分享,預設是false--><QZoneId="3"SortId="3"AppId="100371282"AppKey="aed9b0303e3ed1e27bae87c33761161d"ShareByAppClient="true"Enable="true"/> |
3、自動授權
自動授權就是直接無視授權操作而呼叫其他的操作(如關注或者分享)。在自動授權下,授權操作對開發者而言是透明的,它由ShareSDK內部控制,開發者沒有呼叫授權的程式碼,也沒有辦法接收到授權的結果。比方說如果開發者執行關注,則發起時呼叫的方法是關注,操作回撥中得到的結果(不管成敗)也是關注。
關於這些操作的例子,可以參考其對應的章節。
4、SSO (Single Sign-On)
SSO授權方式,簡單來說就是使用目標平臺客戶端來完成授權。
Platform weibo = ShareSDK.getPlatform(SinaWeibo.NAME); weibo.SSOSetting(false); //設定false表示使用SSO授權方式 weibo.setPlatformActionListener(this); // 設定分享事件回撥 weibo.authorize();1234 | Platformweibo=ShareSDK.getPlatform(SinaWeibo.NAME);weibo.SSOSetting(false);//設定false表示使用SSO授權方式weibo.setPlatformActionListener(this);// 設定分享事件回撥weibo.authorize(); |
使用了SSO授權後,有客戶端的都會優先啟用客戶端授權,沒客戶端的則任然使用網頁版進行授權。
這裡需要注意的是新浪微部落格戶端授權是需要使用者在開發者平臺(網址:http://open.weibo.com)申請的應用用過了新浪的稽核。而且要通過keystore進行簽名打包測試。注意打包所用的keystore上的md5簽名、專案的包名要與新浪開發者平臺上填寫的簽名與包名一致。對比方式如圖:
平臺截圖:
專案包名:
keystore的md5簽名:
5、自定義授權頁面
本節介紹的是如何自定義“Web授權頁面”,由於SSO授權方式使用的是目標平臺的客戶端,ShareSDK無法修改其頁面,因此不在介紹範圍之內。
ShareSDK的所有GUI都基於ShareSDKUIShell,但是ShareSDKUIShell只是一個容器,真正顯示授權頁面主體和邏輯是幾個FakeActivity的子類。這些控制元件在ShareSDK之外是不能修改的,但是考慮到很多開發者希望可以修改這個頁面的佈局、邏輯等等程式碼,因此ShareSDK為此提供了一個自定義授權頁面的方法,操作如下:
1)開啟AndroidManifest.xml,並如下修改ShareSDKUIShell的註冊資訊:
12345678910111213141516 | <activityandroid:name="com.mob.tools.MobUIShell"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:configChanges="keyboardHidden|orientation"android:screenOrientation="portrait"android:windowSoftInputMode="stateHidden|adjustResize"><!--AuthorizeAdapter繼承自cn.sharesdk.framework.authorize.AuthorizeAdapter,可以監聽到頁面的生命週期,也能獲取頁面的各種UI控制元件。開發者可以通過繼承AuthorizeAdapter,重寫其方法,並獲取各種UI來自定義這個頁面的行為。--><meta-dataandroid:name="AuthorizeAdapter"android:value="cn.sharesdk.demo.MyAdapter"/></activity> |
其中的cn.sharesdk.demo.MyAdapter是一個繼承自cn.sharesdk.framework.authorize.AuthorizeAdapter的類。開發者可以根據自己的需要,修改Adapter為任何類名和路徑,但是一定要繼承自AuthorizeAdapter。當然,如果您不想修改授權頁面,可以不設定這個Adapter。
2)建立MyAdapter這個類,然後新增自定義程式碼,如(修改授權頁面標題欄的文字):
1234567891011121314 | publicclassMyAdapterextendsAuthorizeAdapter{publicvoidonCreate(){System.out.println("> ShareSDKUIShell created!");//獲取標題欄控制元件TitleLayoutllTitle=getTitleLayout();//標題欄的文字修改intresID=getStringRes(getActivity(),"second_title");//這個欄位定義在strings.xml檔案裡面llTitle.getTvTitle().setText(resID);}publicvoidonDestroy(){System.out.println("> ShareSDKUIShell will be destroyed.");}} |
上面的onCreate、onResum、onStop、onDestroy等方法都在ShareSDKUIShell的生命週期不停時段被呼叫,如onCreate、onDestroy分別在授權頁面被建立(但還沒有顯示),以及即將被關閉時被呼叫。也就是說可以通過這些方法參與授權頁面的生命週期。而getPlatformName、getTitleLayout和getWebBody分別返回授權平臺的名稱、授權頁面標題欄控制元件和授權頁面主體部分的WebView,開發者可以通過平臺名稱和控制元件例項,修改整個頁面的佈局甚至行為。
請注意,註冊在Adapter下的AuthorizeAdapter子類不能被混淆!否則ShareSDK無法找到這個類。
更多關於自定義授權頁面的操作技巧,請參考ShareSDK BBS上的相關帖子。
6、平臺數據庫的操作
ShareSDK將每一個平臺的授權資料都快取在SharedPreferences中,並且相互獨立。如果您希望獲取任何一個平臺的授權資料,可以像下面這樣子做:
Platform qzone = ShareSDK.getPlatform(this, QZone.NAME); String accessToken = qzone.getDb().getToken(); // 獲取授權token String openId = qzone.getDb().getUserId(); // 獲取使用者在此平臺的ID String nickname = qzone.getDb().get(“nickname”); // 獲取使用者暱稱 // 接下來執行您要的操作12345 | Platformqzone=ShareSDK.getPlatform(this,QZone.NAME);Stringacc |