1. 程式人生 > >友盟社會化分享之自定義內容分享到微信,微博,豆瓣

友盟社會化分享之自定義內容分享到微信,微博,豆瓣

以前移動端要做分享的時候一般是兩種方法,要麼使用Intent呼叫安卓系統自帶的分享功能介面,這是最簡單快捷的方法要麼就自己去QQ微信和各個微博等社交網站申請開發者IDkey,然後在看他們的官方文件,在手機上逐個去實現.所以幾年前應用內建的分享一般只支援主流的幾個社交點 比如QQ,微信和新浪微博幾個但人總是尋找最優化的解決方案,於是隨著技術的成熟,整合類的社會化分享已經成為主流,只要在各大社交站點的開發者平臺申請了所需的賬號和KEY, 就能在一個第三方的平臺通過簡單的引數設定和方法呼叫實現幾乎所有社會化的分享,所以現在在各個新聞APP瀏覽新聞,點選分享當前新聞的時候就會彈出一大堆支援分享的

,甚至支援twitter,Facebook Google+ 等等.

目前國內社會化分享元件做的比較好的是ShareSDK, 友盟 和百度等平臺.個人綜合使用後選擇了友盟服務,因為友盟除了社會化分享做的比較成熟,另外還提供了統計,自動更新,訊息推送,反饋等服務,只要一個賬號就能同時使用他們提供的這些服務哦.

有點扯遠了,下面開始,先做點準備功夫, 然後通過程式碼實現友盟分享到微信好友和微信朋友圈:

一,準備功夫

1, 當然, 先去友盟官方註冊一個賬號

2, 有了賬號登陸,在首頁會看到這個介面:


選擇 "社會化分享"   --> 選擇 "SDK下載" 或者直接點這裡 下載SDK.

就會有勾選下載的介面:


因為本次只用到微信和新浪微博.所以預設勾選的就夠用了.

下載之後,將幾個jar包放到專案的libs資料夾中, 


同時把下載的所有圖片素材和XML檔案都拷貝到對應的專案資料夾中,umeng_socialize_strings.xml在複製的時候可能會因為國際化的原因出錯,自己可以根據需要去修改這個檔案的內容,對功能沒啥影響的.

微信分享是略微特殊的,需要一個WXEntryActivity.java的檔案,裡面是空實現,只在實現微信分享時作回撥用.將下載的名為wxapi資料夾中的WXEntryActivity.java複製到專案類包的任意位置即可,最好是方便歸類尋找的包.

3, 看看官方的文件說明, 你會發現 友盟服務實現分享到微信是非常簡單的~ 這裡繼續把最後的準備功夫做好 -- 在AndroidManifest.xml檔案中進行配置, 官方文件說明很清晰,這裡直接套用一下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.umeng.example"
    android:versionCode="1"
    android:versionName="1.0" >

    <application
        android:debuggable="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Black.NoTitleBar" >

        <!-- ###################註冊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"
            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" />
                <!-- 100424468,如果你使用的公用賬號,則不需要修改;否則修改成你在QQ開放平臺申請的 APP ID-->
                <data android:scheme="tencent100424468" /> 
            </intent-filter>
        </activity>
        <activity android:name="com.tencent.connect.common.AssistActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:screenOrientation="portrait">
        </activity>



    <!-- ###################新增UmengAppkey###################### -->
        <meta-data
            android:name="UMENG_APPKEY"
            android:value="xxxxxxxxxxxxxxxxxxxxxx" >
        </meta-data>

    </application>

    <uses-sdk android:minSdkVersion="8" />

    <!-- ###################宣告SDK使用的相關許可權###################### -->
    <!-- 檢測網路狀態 -->
    <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" />
    <!-- QQ、QQ空間所需許可權 -->
<uses-permission android:name="android.permission.GET_TASKS" />
</manifest>
配置好上面的東西后就算是完成準備功夫了.下面開始實現微信分享:

二,自定義微信好友和朋友圈分享

友盟提供了預設的分享介面. 但我們是要自定義,所以分享介面怎麼實現,自己根據需要去寫佈局喇.

這裡準備好早已申請到微信的appID和appSecret:

根據文件, 寫個方法:

/**
	 * 新增微信到分享列表
	 * @author Mr.Et
	 * @說明  程式碼必須在彈出分享面板前呼叫
	 */
	private void prepareForWechatShare(){
		// 新增微信平臺
		UMWXHandler wxHandler = new UMWXHandler(this,MyConstant.appID,MyConstant.appSecret);
		wxHandler.addToSocialSDK();
		// 支援微信朋友圈
		UMWXHandler wxCircleHandler = new UMWXHandler(this,MyConstant.appID,MyConstant.appSecret);
		wxCircleHandler.setToCircle(true);
		wxCircleHandler.addToSocialSDK();
	}

上面這個方法名自己隨便起,在Activity初始化的時候就去呼叫它,將微信分享新增到友盟的分享列表中.

Activity類中新增友盟分享Controller

/**友盟分享Controller**/
private final UMSocialService mController =
			UMServiceFactory.getUMSocialService("com.umeng.share",RequestType.SOCIAL);

1,分享到微信好友

這裡自定義2個方法實現分享到微信好友的功能,程式碼中有註釋,應該很容易看懂.

/**
	 * 設定微信好友分享內容
	 */
	public static void shareToWebchatFriend(Context context,final UMSocialService mController,String contentStr
			,String subject,String threadUrl,String imageUrl){
		
		WeiXinShareContent weixinContent = new WeiXinShareContent();
		//設定分享文字
		weixinContent.setShareContent(contentStr);
		//設定title
		weixinContent.setTitle(subject);
		//設定分享內容跳轉URL
		weixinContent.setTargetUrl(threadUrl);
		
		//設定分享圖片
		UMImage img;
		if(imageUrl != null ){
//			img = new UMImage(context, 
//					"http://d.hiphotos.baidu.com/image/w%3D2048/sign=1b1f93ad533d26972ed30f5d61c3b3fb/023b5bb5c9//ea15ce8d204e6eb4003af33b87b28f.jpg");
			img = new UMImage(context, imageUrl);
		}else{
			img = new UMImage(context, R.drawable.ic_launcher);
		}
		
		weixinContent.setShareImage(img);
		mController.setShareMedia(weixinContent);
		setShareWechatBtn(context,mController);
	}
	
	/**
	 * 分享給微信某個朋友 - 監聽器
	 */
	private static void setShareWechatBtn(final Context context,final UMSocialService mController){
		
		mController.postShare(context,SHARE_MEDIA.WEIXIN, 
		        new SnsPostListener() {
		                @Override
		                public void onStart() {
		                    UIHelper.ToastMessageShort(context, "開始分享");
		                }

						@Override
						public void onComplete(SHARE_MEDIA arg0, int eCode,
								SocializeEntity arg2) {
							if (eCode == 200) {
		                    	 UIHelper.ToastMessageShort(context, "分享成功");
		                     } else {
		                          String eMsg = "";
		                          if (eCode == -101){
		                              eMsg = "沒有授權";
		                          }
		                          UIHelper.ToastMessageShort(context, "分享失敗[" + eCode + "] " + eMsg);
		                     }
							
						}
		                
				});
	}

上面程式碼中,UMImage 就是分享到微信的標題旁邊那個小圖片, 它支援圖片URL也支援專案資源的圖片ID來建立.

2,分享到微信朋友圈

分享到朋友圈和到微信好友其實很類似,只是新建的物件不一樣.後面分享到微博其實也同樣原理.

/**
	 * 設定微信朋友圈分享內容
	 */
	public static void shareToWechatAllFriends(Context context,final UMSocialService mController,String contentStr
			,String subject,String threadUrl,String imageUrl){
		//CircleShareContent是和分享到微信好友不同的地方
		CircleShareContent circleMedia = new CircleShareContent();
		circleMedia.setShareContent(contentStr);
		//設定朋友圈title
		circleMedia.setTitle(subject);
		
		//設定分享圖片
		UMImage img;
		if(imageUrl != null ){
			img = new UMImage(context, imageUrl);
		}else{
			img = new UMImage(context, R.drawable.ic_launcher);
		}
		circleMedia.setShareImage(img);
		circleMedia.setTargetUrl(threadUrl);
		mController.setShareMedia(circleMedia);
		setShareWechatAllFrdsBtn(context,mController);
	}
	
	/**
	 * 分享給微信朋友圈  - 監聽器
	 * @param context
	 * @param mController
	 */
	private static void setShareWechatAllFrdsBtn(final Context context,final UMSocialService mController){
		mController.postShare(context,SHARE_MEDIA.WEIXIN_CIRCLE, 
		        new SnsPostListener() {
		                @Override
		                public void onStart() {
		                    UIHelper.ToastMessageShort(context, "開始分享");
		                }
						@Override
						public void onComplete(SHARE_MEDIA arg0, int eCode,
								SocializeEntity arg2) {
							if (eCode == 200) {
		                    	 UIHelper.ToastMessageShort(context, "分享成功");
		                     } else {
		                          String eMsg = "";
		                          if (eCode == -101){
		                              eMsg = "沒有授權";
		                          }
		                          UIHelper.ToastMessageShort(context, "分享失敗[" + eCode + "] " + eMsg);
		                     }
							
						}
		                
				});
	}

3,分享到新浪微博和豆瓣

想看文件瞭解的童鞋,可以點這裡 不妨先去看看官方文件進一步瞭解.

類似豆瓣這些第三方分享,在分享前還需要檢測是否已經獲得授權,否則無法實現分享.

/**
	 * 檢測是否已獲取豆瓣授權
	 */
	public static void checkDBRightToShare(){
		if(OauthHelper.isAuthenticated(this,SHARE_MEDIA.DOUBAN)){ //已獲得授權
			ShareUtils.ShareToDouBan(this, loginController
					, contentStr, subject, threadUrl, imageUrl);
		}else{	//先登入獲取授權,再分享
			ShareUtils.LoginDouBan(this, loginController
					, contentStr, subject, threadUrl, imageUrl);
		}
	}

如果沒獲取授權,就顯示登入介面進行登入,然後獲取授權:
/**
	 * 第三方登入 - 豆瓣授權登入
	 */
	///** loginController是針對需要第三方登入授權分享的功能,比如豆瓣,新浪微博,騰訊微博,QQ,Qzone等 **/
	//private UMSocialService loginController = UMServiceFactory.getUMSocialService("com.umeng.login");
	public static void LoginDouBan(final Context mContext,final UMSocialService mController,final String contentStr
			,final String subject,final String threadUrl,final String imageUrl){
		mController.doOauthVerify(mContext, SHARE_MEDIA.DOUBAN, new UMAuthListener() {
			@Override
			public void onStart(SHARE_MEDIA arg0) {
				// TODO Auto-generated method stub
			}
			
			@Override
			public void onError(SocializeException arg0, SHARE_MEDIA arg1) {
				// TODO Auto-generated method stub
			}
			
			@Override
			public void onComplete(Bundle value, SHARE_MEDIA platform) {
				if (value != null && !TextUtils.isEmpty(value.getString("uid"))) {
                    UIHelper.ToastMessageShort(mContext, "授權成功");
                    ShareUtils.ShareToDouBan(mContext, mController
                    		,contentStr, subject, threadUrl, imageUrl);
//                    GetPlatformInfoOfDouBan();
                } else {
                    UIHelper.ToastMessageShort(mContext, "授權失敗");
                }
				
			}
			
			@Override
			public void onCancel(SHARE_MEDIA arg0) {
				// TODO Auto-generated method stub
			}
		});
	}

最後進行實現分享~

/**
	 * 分享到豆瓣
	 * @param mContext
	 * @param mController
	 * @param contentStr
	 * @param subject
	 * @param threadUrl
	 * @param imageUrl
	 */
	public static void ShareToDouBan(final Context mContext,final UMSocialService mController,String contentStr
			,String subject,String threadUrl,String imageUrl){
		//設定分享圖片,(因為分享到豆瓣 不需要使用圖片,所以註釋了. 但如果是分享到微博,將這些註釋全部去掉即可)
//		UMImage img;
//		if(imgAid != null ){
//			img = new UMImage(mContext, imageUrl);
//		}else{
//			img = new UMImage(mContext, R.drawable.ic_launcher);
//		}
//		mController.setShareImage(UMImage);
		
		//設定分享內容
		mController.setShareContent("「"+subject + "」, " + threadUrl+" (分享自@Mr.Et)");
		
		//直接分享
		//如果是新浪微博等,將SHARE_MEDIA.DOUBAN 改成 SHARE_MEDIA.SINA 即可
		mController.directShare(mContext, SHARE_MEDIA.DOUBAN,
	            new SnsPostListener() {
	            @Override
	            public void onStart() {
	                UIHelper.ToastMessageShort(mContext, "分享開始");
	            }
	            @Override
	            public void onComplete(SHARE_MEDIA platform,int eCode, SocializeEntity entity) {
	                if(eCode == StatusCode.ST_CODE_SUCCESSED){
	                    UIHelper.ToastMessageShort(mContext, "分享成功");
	                }else{
	                    UIHelper.ToastMessageShort(mContext, "分享失敗");
	                }
	            }
	    });
	}

其他諸如騰訊微博等分享其實都使用以上類似的方式去實現,觸類旁通,多實踐多嘗試就熟悉了.

下面附上分享到豆瓣的截圖 ^^