一、前言
最近做了個(gè)項(xiàng)目,需要集成分享功能,距離上一個(gè)項(xiàng)目集成分享功能不到兩個(gè)月,原以為分分鐘可以搞定的事情,但是卻花費(fèi)了大半天功夫(簡(jiǎn)直就是浪費(fèi)生命啊......),集成過程還是遇到了一些坑,導(dǎo)致浪費(fèi)了一些不必要的時(shí)間,所以,有的時(shí)候?qū)W過、用過的東西還是得記錄總結(jié)一下,便于以后遇到類似問題時(shí)快速解決,提高效率。
二、爬坑
具體步驟參考官網(wǎng)的ShareSDK官方快速集成文檔 V3.x,這里只說一些注意事項(xiàng):
第一步、獲取ShareSDK;
第二步:導(dǎo)入ShareSDK;
這一步比較簡(jiǎn)單,只說一下ShareSDK.xml需要注意的一些小點(diǎn),AppId和AppSecret替換成自己申請(qǐng)的, BypassApproval設(shè)置為"false",即不繞過審核,這樣才能正確的分享,如果為true,分享出去的圖片就是一個(gè)文件。只要是正式環(huán)境分享,BypassApproval的值都應(yīng)該為false。
<Wechat
Id="4"
SortId="1"
AppId="xxx"
AppSecret="xxx"
userName="gh_afb25ac019c9"
path="pages/index/index.html?id=1"
BypassApproval="false"
Enable="true" />
第三步:配置Android Manifest.xml;
3.1 官方的文檔上少了一個(gè)讀SD卡的權(quán)限,需要自己加一下,該權(quán)限應(yīng)該是用來讀取手機(jī)中是否安裝了分享的App(QQ、微信等),而且如果是6.0+的系統(tǒng)需要?jiǎng)討B(tài)申請(qǐng)?jiān)摍?quán)限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
3.2 Application配置,官方給出了說明,但是不太好找,所以我也把它匯總進(jìn)來:

其他的基本上參照上面給的官方文檔來就行了,我們項(xiàng)目中只集成了微信好友、微信朋友圈、QQ好友、QQ空間,我貼一下我們項(xiàng)目中的集成ShareSDK的Android Manifest.xml部分:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<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.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:name=".App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- 微信分享回調(diào) -->
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
android:name="cn.sharesdk.tencent.qq.ReceiveActivity"
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="tencentxxx" />
</intent-filter>
</activity>
<meta-data
android:name="Mob-AppKey"
android:value="xxx" />
<meta-data
android:name="Mob-AppSecret"
android:value="xxx" />
<!-- ShareSdk end -->
3.3 其中有3項(xiàng)需要替換的地方,“xxx”替換成自己應(yīng)用的相關(guān)key即可,注意第一個(gè)一定要保留
“tencent”前綴:
<data android:scheme="tencentxxx" />
<meta-data
android:name="Mob-AppKey"
android:value="xxx" />
<meta-data
android:name="Mob-AppSecret"
android:value="xxx" />
至此,Android Manifest.xml部分配置完成。
第四步:添加分享代碼;
private void showShare() {
OnekeyShare oks = new OnekeyShare();
//關(guān)閉sso授權(quán)
oks.disableSSOWhenAuthorize();
// 分享時(shí)Notification的圖標(biāo)和文字 2.5.9以后的版本不 調(diào)用此方法
//oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));
// title標(biāo)題,印象筆記、郵箱、信息、微信、人人網(wǎng)和QQ空間使用
oks.setTitle(getString(R.string.app_name));
// titleUrl是標(biāo)題的網(wǎng)絡(luò)鏈接,僅在人人網(wǎng)和QQ空間使用
oks.setTitleUrl("www.qq.com");
// text是分享文本,所有平臺(tái)都需要這個(gè)字段
oks.setText("Text文本內(nèi)容 www.qq.com");
// imagePath是圖片地址,Linked-In以外的平臺(tái)都支持此參數(shù)
// 如果不用本地圖片,千萬不要調(diào)用這個(gè)方法?。?!
// oks.setImagePath("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg");
oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg");
// url僅在微信(包括好友和朋友圈)中使用
oks.setUrl("www.qq.com");
// comment是我對(duì)這條分享的評(píng)論,僅在人人網(wǎng)和QQ空間使用
oks.setComment("我是測(cè)試評(píng)論文本");
// site是分享此內(nèi)容的網(wǎng)站名稱,僅在QQ空間使用
oks.setSite(getString(R.string.app_name));
// siteUrl是分享此內(nèi)容的網(wǎng)站地址,僅在QQ空間使用
oks.setSiteUrl("www.qq.com");
oks.setCallback(new PlatformActionListener() {
@Override
public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
KLog.i("share onComplete...");
}
@Override
public void onError(Platform platform, int i, Throwable throwable) {
KLog.i("share onError..." + throwable);
}
@Override
public void onCancel(Platform platform, int i) {
KLog.i("share onCancel...");
}
});
// 啟動(dòng)分享GUI
oks.show(getActivity());
}
4.1 其中有一個(gè)坑是尤其需要注意的,就是這行代碼:
// 如果不用本地圖片,千萬不要調(diào)用這個(gè)方法?。?!
oks.setImagePath("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg");
分享到QQ好友的時(shí)候,如果你的圖片不是本地圖片,千萬不要調(diào)用這個(gè)方法?。?!
分享到QQ好友的時(shí)候,如果你的圖片不是本地圖片,千萬不要調(diào)用這個(gè)方法?。?!
分享到QQ好友的時(shí)候,如果你的圖片不是本地圖片,千萬不要調(diào)用這個(gè)方法!?。?br>
否則分享失敗,這是我這次分享遇到的最大的坑,其他分享加上這行代碼沒有問題,分享到QQ好友死活不行,最后把這行代碼注釋掉之后終于成功了,心中頓時(shí)一萬頭草泥馬奔騰而過......
4.2 涉及到URL相關(guān)的時(shí)候,最好先用正規(guī)的鏈接測(cè)試,因?yàn)槟愕逆溄尤绻悄莻€(gè)平臺(tái)的黑名單也是會(huì)分享失敗的,確保分享功能正常之后,再替換回自己的鏈接進(jìn)行測(cè)試。比如
oks.setTitleUrl("www.qq.com");
4.3 微信分享一定要打簽名包才能成功;
4.4 不時(shí)清空數(shù)據(jù)。 親測(cè):如果微信開發(fā)者平臺(tái)的簽名做了修改,可能需要清空微信數(shù)據(jù)或者卸載重裝才能分享成功,就問你怕不怕?所以還是先備份好數(shù)據(jù)吧。
4.5 多準(zhǔn)備兩臺(tái)手機(jī)測(cè)試,為什么這么說呢?
由于在這個(gè)項(xiàng)目中我只負(fù)責(zé)把分享功能調(diào)通,具體的分享內(nèi)容是其他童鞋負(fù)責(zé),其中有一個(gè)童鞋在使用我寫的分享功能分享到QQ好友的時(shí)候,死活不成功,分享出來的內(nèi)容各種不對(duì)勁,但是另外一個(gè)童鞋是已經(jīng)成功了的,所以我相信代碼應(yīng)該是ok的,然后我讓他自己調(diào)試一下,各種debug、打log無果之后,我讓他換臺(tái)手機(jī),最終終于成功了!我問他怎么成功的,他說新手機(jī)裝了手機(jī)QQ,舊手機(jī)沒裝。。。。。。。。那一刻,我噴了滿屏鮮血,感覺整個(gè)身體被掏空,我終于體會(huì)到了:不怕神一樣的對(duì)手,就怕沒裝手機(jī)QQ的隊(duì)友還要強(qiáng)行分享到QQ好友!
第五步:完成;
三、后記
總的來說,使用ShareSDK實(shí)現(xiàn)第三方分享還是比較簡(jiǎn)單的,只是有些小坑需要我們注意一下,就能順利集成。有問題歡迎留言反饋,最后附上官方爬坑指南,希望老司機(jī)早日脫坑。