ANDROID新浪微博、微信分享

用的各平臺原生的分享SDK,未采用第三方集成的SDK(例如ShareSDK、友盟U-Share等)。

原因有三:
  1. 不想暴露自己的AppKey、AppID等信息給第三方;
  2. 第三方集成的原生SDK可能不是最新的,或者是排版不對;
  3. 遇到奇怪問題的時候,于第三方客服溝通,有時會解決不了;
注意事項:
  1. 最好是先注冊好賬號,申請相應(yīng)的AppKey或AppID;
  2. 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)
用這個工具查看了下《陰陽師》里面分享的代碼,豁然開朗。


IOS新浪微博、微信分享:點(diǎn)我跳轉(zhuǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容