前言java
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是否填寫正確。