android第三方分享之友盟社會化組件

前言java

  如今幾乎全部的app都帶有分享功能,第一爲了更好地推廣本身的產品,第二做爲使用者也能及時的把本身以爲好的文章,話題,app分享到社交平臺供你們一塊兒學習和使用。開發中雖然android系統自帶分享功能,能夠直接調用。可是系統的功能和平臺每每不是很符合客戶需求和人性化設計。因此不少第三方分享平臺應運而生。今天重點學習一下友盟的社會化組件分享功能的實現。

 

聲明
  歡迎轉載,但請保留文章原始出處:) 
    博客園:http://www.cnblogs.com/wangshuaiandroid/
 
正文
  1、實現目標 

    1.1  社會化組件--分享內容到各大社交平臺android

      支持主流的社交平臺:新浪、微信、QQ空間、騰訊微博、豆瓣、人人、短信、郵箱等等。  web

 

  2、具體步驟api

    

          一、獲取友盟appkey緩存

      去友盟官網http://www.umeng.com註冊開發者帳號
若是你以前已經在友盟註冊了應用,並獲取到了Appkey,能夠繼續使用它.
若是你還沒有在友盟註冊開發者帳號,須要先註冊,註冊以後登陸你的帳號,點擊**添加新應用**,填寫完應用基本信息後,將進入"下載SDK並添加代碼"頁面,此頁面便可獲得Appkey。安全

          二、下載並安裝sdk服務器

     下載最新版本sdk(友盟提供不少社交平臺的分享集成,下載的時候只需勾選本身須要的社交平臺)
添加代碼和資源引用,友盟提供了添加資源文件和jar文件的兩種方式,能夠根據需求選擇微信

  方法一:網絡

       解壓SDK壓縮包,將文件夾中的'main/libs'和'main/res'文件夾複製到你的項目工程根目錄下(如使用'ADT 17'如下用戶須要手動添加'libs'下的jar文件到工程Path中)
注意:
    1:QQ和QQ Zone SSO(免登陸)引用的jar文件相同。當須要同時支持QQ和QQ Zone的時候,只需添加一次SocialSDK_QQZone_1.jar,SocialSDK_QQZone_2.jar,SocialSDK_QQZone_3.jar文件便可.
    2:因爲咱們對微信的包名作了修改(libammsdk.jar -> SocialSDK_WeiXin.jar),如出現"Unable to execute dex: Multiple dex files define "問題,請刪除libammsdk.jar或者SocialSDK_WeiXin.jar中的一個便可解決問題。微信開發

  

   方法二:

     解壓SDK壓縮包,將文件夾中的social_sdk_library_project文件夾導入Eclipse,並在您的工程中添加對此項目的引用便可。

    注意:

    social_sdk_library_project文件夾下包含全部平臺jar包資源只添加本身須要的平臺jar包,多餘的刪除

 

         三、Manifest配置,添加友盟Appkey/Activity/權限

<!-- #######註冊SDK使用的Activity######### -->
        <!--分享編輯頁-->
        <activity
          android:name="com.umeng.socialize.view.ShareActivity"
            android:configChanges="orientation|keyboard"
            android:launchMode="singleTask"
            android:noHistory="true"
            android:theme="@style/Theme.UMDialog"       
android:windowSoftInputMode
="stateVisible|adjustResize" > </activity> <!-- ####QQ空間和QQ SSO受權的Activity註冊 ##### --> <activity android:name="com.tencent.tauth.AuthActivity" /> <!-- 友盟AppKey, 須要替換成你本身的 --> <meta-data android:name="UMENG_APPKEY" android:value="566fb983e0f55a12cd001b84" > </meta-data> <!--####################友盟分享的相關權限 ##################--> <!-- 檢測網絡狀態 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 獲取mac地址做爲用戶的備用惟一標識 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 獲取用戶手機的IMEI,用來惟一的標識用戶 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 緩存資源優先存入SDcard --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 容許應用程序聯網,以便向咱們的服務器端發送數據 --> <uses-permission android:name="android.permission.INTERNET" />

        四、編輯分享代碼

     首先要在各分享平臺註冊開發者帳號,添加你的應用得到相應的appId和appSecret
而後替換到平臺配置中
新浪微博須要在新浪微博開放平臺申請應用,而且填寫應用簽名與包名審覈經過,將申請獲取的appkey及secret綁定在友盟主站後臺。
(在友盟主站找到個人應用--組件--社會化分享--設置--社交平臺配置)
下面是寫好的一個友盟分享工具類
使用時直接調用

ShareUtils.shareUmeng(ct, shareTitle, summary, msgSinaContent, imageUrl, shareUrl);
// 是否只有已登陸用戶才能打開分享選擇頁
ShareUtils.mController.openShare(NewsDetailActivity.this, false);



  /**
     * 友盟分享工具類
     * shareUmeng 
     * /
  public class ShareUtils {
    // 友盟分享平臺的Controller,負責管理整個SDK的配置、操做等處理
    public final UMSocialService mController = UMServiceFactory
                    .getUMSocialService("com.umeng.share");    
    /**
     * 友盟分享
     * shareUmeng 
     * 
     * @param context
     * @param msgTitle
     * @param msgText
     * @param imgPath   
     * void
     */
    public static void shareUmeng(Context context, String msgTitle, String msgContent, String msgSinaContent,  String imgPath, String msgUrl){
        // 配置須要分享的相關平臺
        configPlatforms(context);
        // 設置分享的內容
        setShareContent(context, msgTitle, msgContent, msgSinaContent, imgPath, msgUrl);
        
    }
    
    /**
     * 根據不一樣的平臺設置不一樣的分享內容</br>
     * @param context 
     * @param imgPath 
     * @param msgText 
     * @param msgTitle 
     * @param msgUrl 
     */
    private static void setShareContent(Context context, String msgTitle, String msgContent, String msgSinaContent, String imgPath, String msgUrl) {
        LogUtil.i("Share="+msgContent+imgPath+msgUrl);
        // 配置SSO
        mController.getConfig().setSsoHandler(new SinaSsoHandler());
        //微信
         WeiXinShareContent weixinContent = new WeiXinShareContent();
         // 設置朋友圈分享的內容
         CircleShareContent circleMedia = new CircleShareContent();
         //新浪
         SinaShareContent sinaContent = new SinaShareContent();
        //本地圖片
//      UMImage localImage = new UMImage(context, R.drawable.ic_about_app);
        //url
        UMImage urlImage = new UMImage(context, imgPath);
        // 設置分享圖片,參數2爲本地圖片的路徑(絕對路徑)
//      UMImage urlImage = new UMImage(context, BitmapFactory.decodeFile(imgPath));
         weixinContent.setShareImage(urlImage);
         circleMedia.setShareImage(urlImage);
         sinaContent.setShareImage(urlImage);
        //添加微信分享內容
        weixinContent.setShareContent(msgContent);//分享內容摘要
        weixinContent.setTitle(msgTitle);          //標題
        weixinContent.setTargetUrl(msgUrl);       //url
        mController.setShareMedia(weixinContent);
        //添加朋友圈分享內容
        circleMedia.setShareContent(msgContent);
        circleMedia.setTitle(msgTitle);
        circleMedia.setTargetUrl(msgUrl);
        mController.setShareMedia(circleMedia);
        //添加新浪分析內容
        sinaContent.setShareContent(msgSinaContent);
        sinaContent.setTitle(msgTitle);
        sinaContent.setTargetUrl(msgUrl);
        mController.setShareMedia(sinaContent);
    }
    
    /**
     * 配置分享平臺參數</br>
     * @param context 
     */
    private static void configPlatforms(Context context) {
        // 添加新浪SSO受權
        mController.getConfig().setSsoHandler(new SinaSsoHandler());
        // 添加微信、微信朋友圈平臺
        addWXPlatform(context);
// 打開分享選擇頁並設置分享平臺順序
        mController.getConfig().setPlatforms(SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE, SHARE_MEDIA.SINA);
    }
    
    /**
    * @param context 
     * @功能描述 : 添加微信平臺分享
    * @return
    */
   private static void addWXPlatform(Context context) {
       // 注意:在微信受權的時候,必須傳遞appSecret
       // wx967daebe835fbeac是你在微信開發平臺註冊應用的AppID, 這裏須要替換成你註冊的AppID
       String appId = "xxxxxxxxxxxxxxx";//這個填寫經過的審覈的APPID
       String appSecret = "xxxxxxxxxxxxxxxxxxxxxxx";
       // 添加微信平臺
       UMWXHandler wxHandler = new UMWXHandler(context, appId, appSecret);
       wxHandler.addToSocialSDK();
       // 支持微信朋友圈
       UMWXHandler wxCircleHandler = new UMWXHandler(context, appId, appSecret);
       wxCircleHandler.setToCircle(true);
       wxCircleHandler.addToSocialSDK();
   }
}
在對應的activity中實現onActivityResult方法
/**
     * 若是有使用任一平臺的SSO受權, 則必須在對應的activity中實現onActivityResult方法, 並添加以下代碼
     */
@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        /**使用SSO受權必須添加以下代碼 */
        UMSsoHandler ssoHandler = ShareUtils.mController.getConfig().getSsoHandler(requestCode) ;
        if(ssoHandler != null){
           ssoHandler.authorizeCallBack(requestCode, resultCode, data);
        }
    }
注意onActivityResult方法必須寫在分享所在的Activity或fragment依賴的Activity中,不能夠直接寫在fragment中

      五、混淆

爲了保證引用友盟Social SDK jar文件以及騰訊jar文件被混淆,請在proguard.cfg文件中添加如下代碼避免被混淆.

-dontshrink
-dontoptimize
-dontwarn com.google.android.maps.**
-dontwarn android.webkit.WebView
-dontwarn com.umeng.**
-dontwarn com.tencent.weibo.sdk.**
-dontwarn com.facebook.**


-keep enum com.facebook.**
-keepattributes Exceptions,InnerClasses,Signature
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable

-keep public interface com.facebook.**
-keep public interface com.tencent.**
-keep public interface com.umeng.socialize.**
-keep public interface com.umeng.socialize.sensor.**
-keep public interface com.umeng.scrshot.**

-keep public class com.umeng.socialize.* {*;}
-keep public class javax.**
-keep public class android.webkit.**

-keep class com.facebook.**
-keep class com.facebook.** { *; }
-keep class com.umeng.scrshot.**
-keep public class com.tencent.** {*;}
-keep class com.umeng.socialize.sensor.**
-keep class com.umeng.socialize.handler.**
-keep class com.umeng.socialize.handler.*
-keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.modelmsg.** implements com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}

-keep class im.yixin.sdk.api.YXMessage {*;}
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}

-dontwarn twitter4j.**
-keep class twitter4j.** { *; }

-keep class com.tencent.** {*;}
-dontwarn com.tencent.**
-keep public class com.umeng.soexample.R$*{
    public static final int *;
}
-keep public class com.umeng.soexample.R$*{
    public static final int *;
}
-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.tencent.open.PKDialog$*
-keep class com.tencent.open.PKDialog$* {*;}

-keep class com.sina.** {*;}
-dontwarn com.sina.**
-keep class  com.alipay.share.sdk.** {
   *;
}
-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

         六、更多詳細文檔參考友盟文檔中心http://dev.umeng.com/social/android/operation

         七、在程序入口加入**com.umeng.socialize.utils.Log.LOG = true**,可在LogCat中觀察友盟日誌

         八、經常使用開放平臺
    微信開放平臺:https://open.weixin.qq.com/
    新浪開放平臺:http://open.weibo.com/
    騰訊開放平臺:http://open.qq.com/

        九、//設置打印友盟log日誌
    com.umeng.socialize.utils.Log.LOG = true;
     //關閉友盟toast提示
    mController.getConfig().closeToast();

結束

        按照sdk的demo進行集成後,碰到幾個大坑。如今總結下這些坑同時給出個人解決方法。
       一、點擊qq或空間分享,出現應用無響應(ANR)的狀況。
 解決方法:查查是否分享的圖片參數是否已經設置,沒有設置會出現ANR,設置後能夠正常分享。title、url、    content等參數儘可能都設置一下,以防出現其餘莫名奇妙問題
       二、微信分享不成功。現象是點擊微信或朋友圈分享後,出現微信的界面,提示請稍候,而後一閃而過消失。查看logcat出現錯誤:
## get sso Handler, requestCode = 10086, 微信訪問被拒絕(未知錯誤)-----------微信分享
## get sso Handler, requestCode = 10085, 微信訪問被拒絕(未知錯誤)-----------微信朋友圈分享
解決方法:
這個看看應用md5簽名和在微信開放平臺上登記的md5簽名是否一致。值得注意的是在開放平臺上錄入的md5簽名必須沒有冒號,同時應該所有是小寫字母。請特別注意。若是是一致的話,仍是不行的話,清空下微信緩存,再不行,從新安裝應用或換手機測試。

       三、新浪微博分享,web頁面顯示:你所訪問的站點在微博的認證失敗,請稍後再試。若有疑問,請聯繫XX。(error:redirect_uri_mismatch) 。這種問題每每發生在新提交了移動應用但未審覈的狀況下。
解決方法:須要在微博開放平臺的應用基本信息中配置安全域名:sns.whalecloud.com。同時在高級信息中配置OAuth2.0 受權設置:
受權回調頁:
http://sns.whalecloud.com/sina2/callback
取消受權回調頁:
http://sns.whalecloud.com/sina2/callback

      四、新浪微博開始分享後不久出現分享失敗的錯誤,查看Logcat出現錯誤:sina : error,   User is not in platform app test list解決辦法:從日誌錯誤來看,是提示用來分享的用戶不在平臺應用的測試帳號列表中。這通常發生在未審覈應用中。能夠在應用的測試信息中添加測試帳號來測試分享。      五、新浪微博分享,在安裝微博客戶端的時候,分享時老是提示「sso package or sign error」,而在未安裝微博客戶端的時候,在web auth受權頁面又老是提示來自「來自友盟社會化組件」,而不是顯示來自"XXX應用"。解決辦法:一、檢查應用包名和md5簽名是否在新浪開放平臺填寫正確。二、檢查受權回調頁是否填寫正確三、檢查應用是否審覈成功四、檢查友盟的分享設置頁面,新浪微博分配的appkey和appsecret是否填寫正確並正確綁定。五、若是以上四個步驟都檢查無誤,可是仍是出現來源錯誤的話檢查Androidmanifest.xml中UMENG_APPKEY是否填寫正確。

相關文章
相關標籤/搜索