用的各平臺原生的分享SDK,未采用第三方集成的SDK(例如ShareSDK、友盟U-Share等)。
原因有三:
- 不想暴露自己的AppKey、AppID等信息給第三方;
- 第三方集成的原生SDK可能不是最新的,或者是排版不對;
- 遇到奇怪問題的時候,于第三方客服溝通,有時會解決不了;
注意事項:
- 最好是先注冊好賬號,申請相應(yīng)的AppKey或AppID;
- ANDROID的坑賊多,做好心理準(zhǔn)備;
1. SDK文件相關(guān)配置
- 下載相關(guān)SDK,將SDK文件放到對應(yīng)的lib文件夾(按自己項目的lib文件夾來)下,如下圖:
微信:libammsdk.jar
新浪微博:libweibosdkcore.so,weiboSDKCore_3.1.4.jar - 添加新浪微博和微信分享的回調(diào)界面(Activity),如下圖:
注意:圖中有兩個WXEntryActivity(這個問題到后面再說)。 - 配置AndroidManifest.xml
<!--sina--> <activity android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser" android:configChanges="keyboardHidden|orientation" android:windowSoftInputMode="adjustResize" android:exported="false" > </activity> <service android:name="com.sina.weibo.sdk.net.DownloadService" android:exported="false"> </service> <activity android:name="com.share.demo.WBShareActivity" android:configChanges="keyboardHidden|orientation" android:screenOrientation="portrait" > <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="com.share.demo.wxapi.WXEntryActivity" android:exported="true" /> <activity android:name="com.share.demo.mt.wxapi.WXEntryActivity" android:exported="true" /> <!-- 配置權(quán)限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
2. 編寫自己需要分享的代碼
(1)微信
WXEntryActivity.java,主要功能:接收微信分享回調(diào)。<u>這個文件一定要放在包名的路徑下,ApkPackageName.wxapi下,比如:com.share.demo.wxapi,文件的最后路徑為com.share.demo.wxapi. WXEntryActivity</u>
<u>注意</u>:public class WXEntryActivity extends Activity implements IWXAPIEventHandler 一定要這么寫
(2)新浪
WBShareActivity.java,主要功能:接收新浪分享回調(diào)。<u>這個文件一定要放在包名的路徑下,ApkPackageName下,比如:com.share.demo,文件最后的路徑為com.share.demo. WBShareActivity</u>
<u>注意</u>:
-
public class WBShareActivity extends Activity implements IWeiboHandler.Response, WeiboAuthListener一定要這么寫 - 新浪微博有兩種方式分享:1. Web分享;2. 微信分享
所以要用sendMultiMessage方式分享private void sendMultiMessage(String filePath) { // 1. 初始化微博的分享消息 WeiboMultiMessage weiboMessage = new WeiboMultiMessage(); weiboMessage.textObject = getTextObj(); weiboMessage.imageObject = getImageObj(filePath); // 2. 初始化從第三方到微博的消息請求 SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest(); // 用transaction唯一標(biāo)識一個請求 request.transaction = String.valueOf(System.currentTimeMillis()); request.multiMessage = weiboMessage; //這里直接調(diào)用客戶端,避免與Web分享時的token沖突 if (mWeiboShareAPI.isWeiboAppInstalled()) { boolean isSuccess = mWeiboShareAPI.sendRequest(WBShareActivity.this, request); //Log.e("sinaweibo", "sinaweibo send share msg result is : " + isSuccess); return; } AuthInfo authInfo = new AuthInfo(this, GameShare.SinaWeiboAppKey, GameShare.SinaWeiboRedirectUrl, GameShare.SinaWeiboScope); Oauth2AccessToken accessToken = GameShare.getAccessToken(); String token = ""; if (accessToken != null) { token = accessToken.getToken(); //讀取保存過的token } boolean isSuccess = mWeiboShareAPI.sendRequest(this, request, authInfo, token, this); //Log.e("sinaweibo", "sinaweibo send share msg result is : " + isSuccess); } - 新浪用Web方式分享時,記得要保存驗(yàn)證過的token,否則每次啟動游戲都會要用戶登錄微博
@Override public void onWeiboException( WeiboException arg0 ) { Log.e("sinaweibo", "WeiboAuthListener onWeiboException: "); arg0.printStackTrace(); GameShare.deleteImage(); finish(); } @Override public void onComplete( Bundle bundle ) { // TODO Auto-generated method stub Oauth2AccessToken newToken = Oauth2AccessToken.parseAccessToken(bundle); GameShare.setAccessToken(newToken); } @Override public void onCancel() { Log.e("sinaweibo", "WeiboAuthListener oncancel"); GameShare.deleteImage(); finish(); } - 新浪微博的分享方式:必須通過開啟新的WBShareActivity進(jìn)行分享。
Intent intent = new Intent(getContext(), com.share.demo.WBShareActivity.class); intent.putExtra("FILE_PATH", curImagePath); getContext().startActivity(intent);
總結(jié):
android的配置很容易,但是配置完后遇到的坑還是很多的。
可能遇到的坑
微信的坑:
- 圖片路徑問題,分享的本地圖片一定要放在SDCARD的路徑里面,如果截圖后保存在/data/data/com.share.demo/files/文件夾下,必須把圖片復(fù)制到SDCARD
- 截圖后的縮略圖一定要保證大小<=32KB(32*1024)
//保證thumbData.length <= 32*1024 msg.thumbData = bmpToByteArray(thumbBmp, true); - AndroidManifest.xml里面配置的回調(diào)界面的包名前綴,一定要跟打出來的包名一樣
- 包名和簽名一定要跟申請AppID時填寫的一模一樣
新浪微博的坑
- 新浪微博的縮略圖是自帶的lib文件計算的,所以只要保證截圖不是特別大就行
- AndroidManifest.xml里面配置的回調(diào)界面的包名前綴,可以跟打出來的包名不要一樣,但是如果不一樣,回調(diào)回來時,不是退回應(yīng)用,而是退到主界面(和Home鍵的效果一樣)
- AndroidManifest.xml里面配置的回調(diào)界面的包名前綴、包名和簽名一定要存在申請AppKey時填寫的信息中
- 目前微博有幾個已知BUG:
- 用Web分享時,如果分享成功后,在等待關(guān)閉的3秒內(nèi),點(diǎn)左上角的關(guān)閉,那么只會收到取消分享的回調(diào),而不是分享成功的回調(diào)
- 用微博客戶端分享時,如果是剛安裝的微博(未登錄),那么點(diǎn)擊分享時,會要求用戶登錄微博,如果在此時關(guān)閉微博,那么退回應(yīng)用時,會停留在開啟的WBShareActivity界面(即沒有收到任何回調(diào))
游戲多渠道處理
查了好久資料,沒有查到相關(guān)信息。所以只能用一些奇怪的辦法。
- 微博多渠道
只要在申請AppKey的地方填寫多個包名和簽名,然后在AndroidManifest.xml里面配置一個回調(diào)界面。有個副作用就是,如果配置的包名前綴和當(dāng)前包名不一樣,那么回調(diào)回來后是退回到主界面,而不是應(yīng)用。 - 微信多渠道
前面提到了配置多個WXEntryActivity,就是為了這個多渠道,在AndroidManifest.xml里面也要配置多個回調(diào)界面。然后通過包名向服務(wù)器取到正確的AppID后,再初始化微信Api。
如果大家有更好的多渠道方式,還請教教我,感謝感謝!~~~
--------------------------- 分割線 ---------------------------
更新時間:2016年12月16日14:23
工具:點(diǎn)我跳轉(zhuǎn)
用這個工具查看了下《陰陽師》里面分享的代碼,豁然開朗。

