前言:
現(xiàn)在國內(nèi)大部分APP應(yīng)用都集成了第三方登錄和社會化分享,主要都是為了方便用戶使用軟件的同時又宣傳推廣應(yīng)用。而市面上大多數(shù)的主流的軟件都開放了第三方登錄和社會化分享,假如每一個平臺都一個一個地去集成,可能就太消耗時間和加大了工作量,好在這種登錄和分享功能已經(jīng)有第三方平臺幫我們做好了,我們直接調(diào)用其SDK即可。國內(nèi)用的比較多的就是Mob和友盟,這里我們以mob為例。
首先官網(wǎng)地址是:http://www.mob.com/
當然只有注冊了用戶,才可以創(chuàng)建應(yīng)用,使用第Mob平臺提供的第三方登錄和社會化分享工具。好了不廢話,進入正題。
第一步登錄官網(wǎng)首頁
點擊右側(cè)頭像欄那里,選擇進入后臺,選擇ShareSDK,立即使用并創(chuàng)建名為MobShareSDKDemo的Android應(yīng)用。
獲取創(chuàng)建應(yīng)用成功后的APP Key和 APP Secret。
點擊下方鏈接下載SDK。
http://www.mob.com/#/downloadDetail/ShareSDK/android
這里我們以QQ,微信,新浪微博為例,僅需要下載相對應(yīng)的集成文檔即可。
下載完成后是一個壓縮包,解壓之后有兩個文件夾,一個是ShareSDK for Android ApiDoc,顧名思義就是一個api文檔。另外一個是ShareSDK for Android,這里我們打開這個文件夾,這里面包含分享的源碼和所需要的資源文件和jar包。如下圖:
第二步去各大社交平臺繼續(xù)注冊應(yīng)用
這里我們以QQ,微信,微博為例,所以需要到相應(yīng)的開發(fā)平臺進行注冊,跟Mob平臺同一個道理,只有注冊完之后才能進行py交易,歐不,是進行第三方平臺登錄和社會化分享。
1.騰訊開放平臺
申請地址: http://open.qq.com/
如果沒有在騰訊開放平臺注冊過開發(fā)者信息,需要先注冊完后,待開發(fā)者信息審核通過,我們實際項目應(yīng)用才能上線。否則會受到騰訊平臺的限制。以下微信,微博同理。
來到開放平臺首頁,找到“應(yīng)用接入”--->"創(chuàng)建移動應(yīng)用"--->“移動應(yīng)用 安卓”--->創(chuàng)建應(yīng)用后“完善信息”--->保存騰訊開放平臺提供給我們的APP ID和APP KEY
應(yīng)用信息填寫完整,這里我們僅僅是演示demo,把有的信息填上去即可,沒有的不填也沒有關(guān)系,最后保存應(yīng)用信息。然后點擊“管理中心”來到管理中心頁面,找到未上線的項目MobShareSDKDemo,點進去,進入我們Demo的詳情頁。由于這里我們需要做到QQ登錄,所以我們需要在基礎(chǔ)服務(wù)那一欄里找到“QQ登錄”,添加應(yīng)用調(diào)試者信息。其實說白了就是添加幾個qq號碼,在調(diào)試的時候可以使用。
2.微信開放平臺
申請地址: https://open.weixin.qq.com/
來到微信開放平臺首頁,在標題欄找到“管理中心”--->"創(chuàng)建移動應(yīng)用"--->“填寫基本信息”--->“填寫平臺信息”
※ 這里需要注意的是應(yīng)用簽名這一欄,在實際項目開發(fā)過程中,應(yīng)用簽名需要先使用簽名文件生成apk包安裝到手機上,再根據(jù)簽名生成工具獲得應(yīng)用簽名。
studio如何生成簽名文件,可以戳下面這個鏈接:
Android Studio生成簽名工具,自動簽名,以及生成SHA1和MD5的值
下載簽名生成工具請戳下面這個鏈接:
https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
最后得到的應(yīng)用簽名如下,填寫完信息,微信需要審核,審核時間為7天左右,但實際審核一般幾天就能通過,不過在實際開發(fā)過程中,最好還是提前申請注冊應(yīng)用信息。
3.新浪微博開放平臺
申請地址:http://open.weibo.com/
來到新浪微博開放平臺首頁,在找到“移動應(yīng)用”--->"立即接入"--->“創(chuàng)建新應(yīng)用”--->填寫完應(yīng)用名稱,選擇Android平臺即可
在應(yīng)用信息中“基本信息”可以找到我們需要接下來填入到ShareSDK.xml中的App Key、App Secret
※ 這里需要注意的是我們需要在“高級信息”中填寫OAuth2.0 授權(quán)設(shè)置回調(diào)地址。否則會報一個redirect_uri_mismatch的錯誤信息
※ 同時要注意的是我們需要在“基本信息”中編輯應(yīng)用基本信息。我們可以填3套對應(yīng)包名簽名應(yīng)用信息。這里,包名都一樣(com.donkor.demo.mobsharesdk),我們填寫兩套Android簽名即可,一個根據(jù)debug.apk安裝上去根據(jù)包名獲取。一個根據(jù)對應(yīng)的簽名文件安裝到手機上的release.apk獲得。第一個是方便我們在調(diào)試的過程中測試,第二個則是方便我們項目上線時使用。新浪微博要求的其他應(yīng)用基本信息必須填寫的,根據(jù)要求把他填寫完整,保存即可。
※ 應(yīng)用信息沒有提交審核。想要測試的話,還需要添加測試賬號信息。否則會報一個號碼403的 applications over the unaudited use restrictions!錯誤。
文件不存在(C8998)的錯誤,同樣經(jīng)常出現(xiàn)。原因可能是臺上的包名和簽名與應(yīng)用的不相同,或者是OAuth2.0授權(quán)設(shè)置中設(shè)置你的回調(diào)地址與應(yīng)用內(nèi)調(diào)用的不同。
第三步配置信息與使用
1.打開studio新建MobShareSDKDemo的項目
2.依賴所需要的jar包和新建一個assets文件夾放入ShareSDK.xml
3.將上面下載下來,解壓出來的SDK中ShareSDK for Android\Libs\OneKeyShare\src目錄下的源碼直接拷貝到項目中
4.這里由于使用到了微信,所以需要新建wxapi目錄再放置WXEntryActivity(這里的目錄名和類名必須遵從微信的要求)
WXEntryActivity.java的代碼如下:
/*
* 官網(wǎng)地站:http://www.mob.com
* 技術(shù)支持QQ: 4006852216
* 官方微信:ShareSDK (如果發(fā)布新版本的話,我們將會第一時間通過微信將版本更新內(nèi)容推送給您。如果使用過程中有任何問題,也可以通過微信與我們?nèi)〉寐?lián)系,我們將會在24小時內(nèi)給予回復(fù))
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package com.donkor.demo.mobsharesdk.wxapi;
import android.content.Intent;
import android.widget.Toast;
import cn.sharesdk.wechat.utils.WXAppExtendObject;
import cn.sharesdk.wechat.utils.WXMediaMessage;
import cn.sharesdk.wechat.utils.WechatHandlerActivity;
/** 微信客戶端回調(diào)activity示例 */
public class WXEntryActivity extends WechatHandlerActivity {
/**
* 處理微信發(fā)出的向第三方應(yīng)用請求app message
* <p>
* 在微信客戶端中的聊天頁面有“添加工具”,可以將本應(yīng)用的圖標添加到其中
* 此后點擊圖標,下面的代碼會被執(zhí)行。Demo僅僅只是打開自己而已,但你可
* 做點其他的事情,包括根本不打開任何頁面
*/
public void onGetMessageFromWXReq(WXMediaMessage msg) {
if (msg != null) {
Intent iLaunchMyself = getPackageManager().getLaunchIntentForPackage(getPackageName());
startActivity(iLaunchMyself);
}
}
/**
* 處理微信向第三方應(yīng)用發(fā)起的消息
* <p>
* 此處用來接收從微信發(fā)送過來的消息,比方說本demo在wechatpage里面分享
* 應(yīng)用時可以不分享應(yīng)用文件,而分享一段應(yīng)用的自定義信息。接受方的微信
* 客戶端會通過這個方法,將這個信息發(fā)送回接收方手機上的本demo中,當作
* 回調(diào)。
* <p>
* 本Demo只是將信息展示出來,但你可做點其他的事情,而不僅僅只是Toast
*/
public void onShowMessageFromWXReq(WXMediaMessage msg) {
if (msg != null && msg.mediaObject != null
&& (msg.mediaObject instanceof WXAppExtendObject)) {
WXAppExtendObject obj = (WXAppExtendObject) msg.mediaObject;
Toast.makeText(this, obj.extInfo, Toast.LENGTH_SHORT).show();
}
}
}
5.配置相應(yīng)的權(quán)限和注冊所需要的Activity
<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"/>
<!-- 藍牙分享所需的權(quán)限,不需要用到的話可以省略 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<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>
<!-- ※這里需要將1105785901改成你在騰訊申請后得到的AppId-->
<data android:scheme="tencent1105785901" />
<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,需要注冊的回調(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>
</activity>
<!--微信分享回調(diào) -->
<activity
android:name=".wxapi.WXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait" />
6.修改ShareSDK.xml文件
這里我們以新浪微博,QQ為例。微信因為沒有審核通過,所以沒辦法驗證。想驗證的話,需要在微信平臺填寫完清晰,完整的信息,提交審核通過之后即可,修改的過程同下。
<!-- 修改成你在sharesdk后臺注冊的應(yīng)用的appkey"-->
<ShareSDK
AppKey = "1985fae01629d"/>
<SinaWeibo
Id="2"
SortId="2"
AppKey="2022241043"
AppSecret="6e22ea802d34e493d6663294bd7597a0 "
RedirectUrl="http://blog.csdn.net/donkor_"
ShareByAppClient="true"
Enable="true" />
<QQ
Id="7"
SortId="7"
AppId="1105785901"
AppKey="k2sXKmeDIqrjpLO4"
BypassApproval="true"
ShareByAppClient="true"
Enable="true"/>
7.添加分享代碼
ShareSDK.initSDK(MainActivity.this);
OnekeyShare oks = new OnekeyShare();
// 關(guān)閉sso授權(quán)
oks.disableSSOWhenAuthorize();
// 分享時Notification的圖標和文字 2.5.9以后的版本不調(diào)用此方法
// oks.setNotification(R.drawable.ic_launcher,
// getString(R.string.app_name));
// title標題,印象筆記、郵箱、信息、微信、人人網(wǎng)和QQ空間使用
oks.setTitle("分享標題");
// titleUrl是標題的網(wǎng)絡(luò)鏈接,僅在人人網(wǎng)和QQ空間使用
oks.setTitleUrl("http://blog.csdn.net/donkor_");
// text是分享文本,所有平臺都需要這個字段
oks.setText("分享文本內(nèi)容");
// imagePath是圖片的本地路徑,Linked-In以外的平臺都支持此參數(shù)
// oks.setImagePath("/sdcard/test.jpg");//
// 確保SDcard下面存在此張圖片
oks.setImageUrl("http://img.blog.csdn.net/20161115193036196");
// url僅在微信(包括好友和朋友圈)中使用
oks.setUrl("http://blog.csdn.net/donkor_");
// comment是我對這條分享的評論,僅在人人網(wǎng)和QQ空間使用
//oks.setComment("");
// site是分享此內(nèi)容的網(wǎng)站名稱,僅在QQ空間使用
oks.setSite(getString(R.string.app_name));
// siteUrl是分享此內(nèi)容的網(wǎng)站地址,僅在QQ空間使用
//oks.setSiteUrl(getString(R.string.settingShareSiteUrl));
// 啟動分享GUI
oks.show(MainActivity.this);
8.添加第三方登錄代碼
//初始化
ShareSDK.initSDK(this);
//執(zhí)行授權(quán),獲取用戶信息
private void authorize(Platform plat) {
if (plat.isValid()) {
String userId = plat.getDb().getUserId();
if (!TextUtils.isEmpty(userId)) {
UIHandler.sendEmptyMessage(MSG_USERID_FOUND, this);
login(plat.getName(), userId, null);
return;
}
}
plat.setPlatformActionListener(MainActivity.this);
//true不使用SSO授權(quán),false使用SSO授權(quán)
plat.SSOSetting(false);
plat.showUser(null);
}
//發(fā)送登陸信息
private void login(String plat, String userId, HashMap<String, Object> userInfo) {
Message msg = new Message();
msg.what = MSG_LOGIN;
msg.obj = plat;
UIHandler.sendMessage(msg, this);
}
UIHandler需要實現(xiàn)接口,并實現(xiàn)其中的方法
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MSG_USERID_FOUND: {
Toast.makeText(this, R.string.userid_found, Toast.LENGTH_SHORT).show();
}
break;
case MSG_LOGIN: {
String text = getString(R.string.logining, msg.obj);
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}
break;
case MSG_AUTH_CANCEL: {
Toast.makeText(this, R.string.auth_cancel, Toast.LENGTH_SHORT).show();
}
break;
case MSG_AUTH_ERROR: {
Toast.makeText(this, R.string.auth_error, Toast.LENGTH_SHORT).show();
}
break;
case MSG_AUTH_COMPLETE: {
Toast.makeText(this, R.string.auth_complete, Toast.LENGTH_SHORT).show();
}
break;
}
return false;
}
plat.setPlatformActionListener(MainActivity.this)設(shè)置監(jiān)聽,需要實現(xiàn)它的三個方法:
- onCancel 取消
- onComplete 完成
- onError 異常
@Override
public void onComplete(Platform platform, int action, HashMap<String, Object> res) {
if (action == Platform.ACTION_USER_INFOR) {
//登錄成功,獲取需要的信息
UIHandler.sendEmptyMessage(MSG_AUTH_COMPLETE, this);
login(platform.getName(), platform.getDb().getUserId(), res);
Log.e("asd", "platform.getName():" + platform.getName());
Log.e("asd", "platform.getDb().getUserId()" + platform.getDb().getUserId());
String openid = platform.getDb().getUserId() + "";
String gender = platform.getDb().getUserGender();
String head_url = platform.getDb().getUserIcon();
String nickname = platform.getDb().getUserName();
Log.e("asd", "openid:" + openid);
Log.e("asd", "gender:" + gender);
Log.e("asd", "head_url:" + head_url);
Log.e("asd", "nickname:" + nickname);
}
}
@Override
public void onError(Platform platform,int action,Throwable t){
if(action==Platform.ACTION_USER_INFOR){
UIHandler.sendEmptyMessage(MSG_AUTH_ERROR,this);
}
t.printStackTrace();
}
@Override
public void onCancel(Platform platform, int action) {
if (action == Platform.ACTION_USER_INFOR) {
UIHandler.sendEmptyMessage(MSG_AUTH_CANCEL, this);
}
}
清除第三方登錄,分享的信息與緩存
Platform qq = ShareSDK.getPlatform(MainActivity.this, QQ.NAME);
Platform wechat = ShareSDK.getPlatform(MainActivity.this, Wechat.NAME);
Platform weibo = ShareSDK.getPlatform(MainActivity.this, SinaWeibo.NAME);
if (qq.isValid()) {
qq.removeAccount();
}
if (wechat.isValid()) {
wechat.removeAccount();
}
if (weibo.isValid()) {
weibo.removeAccount();
}
string.xml
<string name="userid_found">用戶信息已存在,正在跳轉(zhuǎn)登錄操作…</string>
<string name="logining">使用%s帳號登錄中…</string>
<string name="auth_cancel">授權(quán)操作已取消</string>
<string name="auth_error">授權(quán)操作遇到錯誤,請閱讀Logcat輸出</string>
<string name="auth_complete">授權(quán)成功,正在跳轉(zhuǎn)登錄操作…</string>
布局activity_main.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:background="@android:color/white"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="50dp"
android:orientation="horizontal">
<View
android:layout_width="0dp"
android:layout_height="0.3dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:background="@android:color/black" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:text="第三方賬號登錄"
android:textSize="14sp" />
<View
android:layout_width="0dp"
android:layout_height="0.3dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:background="@android:color/black" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/ivQQ"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/img_qq" />
<ImageView
android:id="@+id/ivWeChat"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/img_wechat" />
<ImageView
android:id="@+id/ivSinaWeibo"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/img_weibo" />
</LinearLayout>
<Button
android:id="@+id/btnRemoveMsg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="退出第三方登錄數(shù)據(jù)信息"
android:layout_margin="30dp"
/>
<Button
android:id="@+id/btnShare"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="社會化分享"
android:layout_margin="30dp"
/>
</LinearLayout>
視頻演示效果:
視頻鏈接地址
下載地址 : http://download.csdn.net/detail/donkor_/9700844
關(guān)于我:
- Android開發(fā)交流QQ群:537891203
- 郵箱:donkor@yeah.net