引言java
如今APP開發集成分享功能已是很是廣泛的需求了。其餘集成分享技術我沒有使用過,今天我就來介紹下使用ShareSDK來進行分享功能開發的一些基本步驟和注意點,幫助朋友們避免一些坑。好了,下面切入正題正式開始介紹。android
一、ShareSDK開發包及配置api
這個不用多說,去他們官網看找SDK開發包和集成文檔便可。Android版本地址:http://www.mob.com/downloadDetail/ShareSDK/android。注意:記得要註冊ShareSDK帳號獲取AppKey哦。這些集成文檔裏面應該都有,仔細看便可。微信
二、去各大應用平臺註冊獲取AppKey和AppSecret微信開發
這個步驟要看大家團隊想分享到哪些平臺了,通常都是微博和微信。因此通常都去新浪微博和微信開發平臺註冊。app
新浪開發平臺:http://open.weibo.com/ide
騰訊開放平臺:https://open.weixin.qq.com/工具
三、一鍵分享功能的集成佈局
使用ShareSDK進行分享,若是你不須要進行定製開發的話,就可使用ShareSDK裏面自帶的一鍵分享模塊。使用以前別忘記把ShareSDK中的jar包和ShareSDK.xml放到指定位置哦(配置文檔裏面都有,慢慢看便可)。ui
在application節點下注冊下面的Activity如圖所示:
注意:將紅框部分的數字改爲在騰訊開放平臺申請到的AppId便可。
若是項目集成了微信,還須要添加如下WXEntryActivity,否則的話,mob後臺沒法作微信的分享統計:(在工程的包下新建wxapi目錄再放置WXEntryActivity)
1 <!-- 微信分享配置 --> 2 <activity 3 android:name=".wxapi.WXEntryActivity" 4 android:configChanges="keyboardHidden|orientation|screenSize" 5 android:exported="true" 6 android:screenOrientation="portrait" 7 android:theme="@android:style/Theme.Translucent.NoTitleBar" />
WXEntryActivity.java代碼以下:
1 /* 2 * 官網地站:http://www.mob.com 3 * 技術支持QQ: 4006852216 4 * 官方微信:ShareSDK (若是發佈新版本的話,咱們將會第一時間經過微信將版本更新內容推送給您。若是使用過程當中有任何問題,也能夠經過微信與咱們取得聯繫,咱們將會在24小時內給予回覆) 5 * 6 * Copyright (c) 2013年 mob.com. All rights reserved. 7 */ 8 9 package com.example.haoyunhl.controller.wxapi; 10 11 import android.content.Intent; 12 import android.widget.Toast; 13 import cn.sharesdk.wechat.utils.WXAppExtendObject; 14 import cn.sharesdk.wechat.utils.WXMediaMessage; 15 import cn.sharesdk.wechat.utils.WechatHandlerActivity; 16 17 /** 微信客戶端回調activity示例 */ 18 public class WXEntryActivity extends WechatHandlerActivity { 19 20 /** 21 * 處理微信發出的向第三方應用請求app message 22 * <p> 23 * 在微信客戶端中的聊天頁面有「添加工具」,能夠將本應用的圖標添加到其中 24 * 此後點擊圖標,下面的代碼會被執行。Demo僅僅只是打開本身而已,但你可 25 * 作點其餘的事情,包括根本不打開任何頁面 26 */ 27 public void onGetMessageFromWXReq(WXMediaMessage msg) { 28 if (msg != null) { 29 Intent iLaunchMyself = getPackageManager().getLaunchIntentForPackage(getPackageName()); 30 startActivity(iLaunchMyself); 31 } 32 } 33 34 /** 35 * 處理微信向第三方應用發起的消息 36 * <p> 37 * 此處用來接收從微信發送過來的消息,比方說本demo在wechatpage裏面分享 38 * 應用時能夠不分享應用文件,而分享一段應用的自定義信息。接受方的微信 39 * 客戶端會經過這個方法,將這個信息發送回接收方手機上的本demo中,看成 40 * 回調。 41 * <p> 42 * 本Demo只是將信息展現出來,但你可作點其餘的事情,而不只僅只是Toast 43 */ 44 public void onShowMessageFromWXReq(WXMediaMessage msg) { 45 if (msg != null && msg.mediaObject != null 46 && (msg.mediaObject instanceof WXAppExtendObject)) { 47 WXAppExtendObject obj = (WXAppExtendObject) msg.mediaObject; 48 Toast.makeText(this, obj.extInfo, Toast.LENGTH_SHORT).show(); 49 } 50 } 51 52 }
下面你就能夠調用一鍵分享功能進行簡單的分享了,記住在調用以前一點要先調用ShareSDK.initSDK(this)這個方法。
說明:一鍵分享雖然簡單,可是若是想要對一鍵分享界面進行修改時比較麻煩的,據說如今版本修改界面好像方便不少了?(不清楚,兄弟你能夠去集成文檔瞧瞧)。下面我就來介紹自定義的分享界面。
四、自定義分享界面的開發
先看效果圖:
下面就來詳細介紹這個分享界面的開發
界面樣式的佈局相信你們應該都很熟悉了,我這裏就不貼樣式佈局的代碼了。我在開發中將分享功能集成到了一個組件中(ShareDialog)。詳細代碼以下:
1 package com.mobile.develop.framework.dialog; 2 3 import android.app.Dialog; 4 import android.content.Context; 5 import android.content.DialogInterface.*; 6 import android.view.Display; 7 import android.view.Gravity; 8 import android.view.LayoutInflater; 9 import android.view.View; 10 import android.view.Window; 11 import android.view.WindowManager; 12 import android.widget.LinearLayout; 13 import android.widget.TextView; 14 import com.example.haoyunhl.controller.R; 15 16 public class ShareDialog { 17 private Dialog mDialog; 18 //取消分享 19 private TextView txtCancle; 20 private OnClickListener mOnCancleListener; 21 //微信分享 22 private LinearLayout mWeChatShare; 23 private OnClickListener mOnWeChatShareListener; 24 //微信朋友圈分享 25 private LinearLayout mWeChatFriendShare; 26 private OnClickListener mOnWeChatFriendShareListener; 27 //QQ分享 28 private LinearLayout mQQShare; 29 private OnClickListener mOnQQShareListener; 30 private Context mContext; 31 private Display display; 32 33 public ShareDialog(Context context){ 34 mContext=context; 35 //獲取屏幕對象 36 WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 37 display = windowManager.getDefaultDisplay(); 38 } 39 40 //設置微信分享 41 public ShareDialog setOnWeChatShare(OnClickListener weChatShareListener){ 42 mOnWeChatShareListener=weChatShareListener; 43 return this; 44 } 45 46 //設置分享朋友圈 47 public ShareDialog setOnWeChatFriendShare(OnClickListener weChatFriendShareListener){ 48 mOnWeChatFriendShareListener=weChatFriendShareListener; 49 return this; 50 } 51 52 //QQ分享 53 public ShareDialog setOnQQShare(OnClickListener qqShareListener){ 54 mOnQQShareListener=qqShareListener; 55 return this; 56 } 57 58 public ShareDialog setOnCancleListener(OnClickListener cancleListener){ 59 mOnCancleListener=cancleListener; 60 return this; 61 } 62 63 public void show(){ 64 mDialog.show(); 65 } 66 67 public void dismiss(){ 68 mDialog.dismiss(); 69 } 70 71 /** 72 * 建立BaseDialog實例 73 * @return 74 */ 75 public ShareDialog builder(){ 76 LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 77 View view = inflater.inflate(R.layout.share_dialg_style, null); 78 //設置彈出框橫向鋪滿整個屏幕 79 view.setMinimumWidth(display.getWidth()); 80 mDialog = new Dialog(mContext, R.style.ActionSheetDialogStyle); 81 //設置dialog彈出後會點擊屏幕,dialog不消失;點擊物理返回鍵dialog消失 82 mDialog.setCanceledOnTouchOutside(true); 83 Window dialogWindow = mDialog.getWindow(); 84 dialogWindow.setGravity(Gravity.CENTER | Gravity.BOTTOM); 85 WindowManager.LayoutParams lp = dialogWindow.getAttributes(); 86 lp.x = 0; 87 lp.y = 0; 88 dialogWindow.setAttributes(lp); 89 //設置點擊隱藏 90 txtCancle=(TextView)view.findViewById(R.id.txtCancle); 91 txtCancle.setOnClickListener(new View.OnClickListener() { 92 @Override 93 public void onClick(View v) { 94 if (mOnCancleListener != null) { 95 mOnCancleListener.onClick(mDialog, Dialog.BUTTON_NEGATIVE); 96 } 97 dismiss(); 98 } 99 }); 100 //微信分享 101 mWeChatShare=(LinearLayout)view.findViewById(R.id.mWeChatShare); 102 mWeChatShare.setOnClickListener(new View.OnClickListener() { 103 @Override 104 public void onClick(View v) { 105 if (mOnWeChatShareListener != null) { 106 mOnWeChatShareListener.onClick(mDialog, Dialog.BUTTON_POSITIVE); 107 } 108 dismiss(); 109 } 110 }); 111 //朋友圈分享 112 mWeChatFriendShare=(LinearLayout)view.findViewById(R.id.mWeChatFriendShare); 113 mWeChatFriendShare.setOnClickListener(new View.OnClickListener() { 114 @Override 115 public void onClick(View v) { 116 if(mOnWeChatFriendShareListener!=null) { 117 mOnWeChatFriendShareListener.onClick(mDialog, Dialog.BUTTON_POSITIVE); 118 } 119 dismiss(); 120 } 121 }); 122 //QQ分享 123 mQQShare=(LinearLayout)view.findViewById(R.id.mQQShare); 124 mQQShare.setOnClickListener(new View.OnClickListener() { 125 @Override 126 public void onClick(View v) { 127 if(mOnQQShareListener!=null){ 128 mOnQQShareListener.onClick(mDialog,Dialog.BUTTON_POSITIVE); 129 } 130 } 131 }); 132 mDialog.setContentView(view); 133 return this; 134 } 135 }
咱們自定義分享時只須要重寫SharePlatform.java便可。在這個文件中經過不一樣的分支,來執行不一樣的分享邏輯。代碼以下:
1 package com.example.haoyunhl.utils; 2 3 import android.app.Activity; 4 import android.content.Context; 5 import android.os.Handler; 6 import android.os.Message; 7 import android.widget.Toast; 8 import java.util.HashMap; 9 import cn.sharesdk.framework.Platform; 10 import cn.sharesdk.framework.PlatformActionListener; 11 import cn.sharesdk.framework.ShareSDK; 12 import cn.sharesdk.tencent.qq.QQ; 13 import cn.sharesdk.wechat.friends.Wechat; 14 import cn.sharesdk.wechat.moments.WechatMoments; 15 16 public class SharePlatform extends Activity implements PlatformActionListener { 17 18 private Context context; 19 20 public SharePlatform(Context context){ 21 this.context=context; 22 ShareSDK.initSDK(this.context); 23 } 24 25 /** 26 * 分享回調 27 */ 28 @Override 29 public void onCancel(Platform arg0, int arg1) { 30 //回調的地方是子線程,進行UI操做要用handle處理 31 handler.sendEmptyMessage(4); 32 } 33 34 @Override 35 public void onComplete(Platform arg0, int arg1, HashMap<String, Object> arg2) { 36 //回調的地方是子線程,進行UI操做要用handle處理 37 if (arg0.getName().equals(Wechat.NAME)) { 38 handler.sendEmptyMessage(1); 39 } else if (arg0.getName().equals(WechatMoments.NAME)) { 40 handler.sendEmptyMessage(2); 41 } else if (arg0.getName().equals(QQ.NAME)) { 42 handler.sendEmptyMessage(3); 43 } 44 } 45 46 @Override 47 public void onError(Platform arg0, int arg1, Throwable arg2) { 48 //回調的地方是子線程,進行UI操做要用handle處理 49 arg2.printStackTrace(); 50 Message msg = new Message(); 51 msg.what = 5; 52 msg.obj = arg2.getMessage(); 53 handler.sendMessage(msg); 54 } 55 56 Handler handler = new Handler() { 57 @Override 58 public void handleMessage(Message msg) { 59 switch (msg.what) { 60 case 1: 61 Toast.makeText(context, "微信分享成功", Toast.LENGTH_LONG).show(); 62 break; 63 case 2: 64 Toast.makeText(context, "朋友圈分享成功", Toast.LENGTH_LONG).show(); 65 break; 66 case 3: 67 Toast.makeText(context, "QQ分享成功", Toast.LENGTH_LONG).show(); 68 break; 69 case 4: 70 Toast.makeText(context, "取消分享", Toast.LENGTH_LONG).show(); 71 break; 72 case 5: 73 Toast.makeText(context, "分享失敗", Toast.LENGTH_LONG).show(); 74 break; 75 default: 76 break; 77 } 78 } 79 }; 80 81 82 /** 83 * 進行分享 84 * 85 * @param shareType 86 * @param shareTitle 87 * @param shareText 88 * @param shareImageUrl 89 * @param shareUrl 90 */ 91 public void share(String shareType, String shareTitle, String shareText, String shareImageUrl, String shareUrl) { 92 Platform.ShareParams sharePlatform = new Platform.ShareParams(); 93 Platform platform; 94 /** 95 * 若是是微信朋友圈分享 96 */ 97 if(shareType.equalsIgnoreCase(ShareConfig.WeChatMomentsShare)){ 98 sharePlatform.setShareType(Platform.SHARE_WEBPAGE); 99 100 setSharePlatform(sharePlatform,shareTitle, shareText, shareImageUrl); 101 102 if(shareUrl!=null && !shareUrl.equalsIgnoreCase("")) { 103 sharePlatform.setUrl(shareUrl); 104 } 105 106 platform = ShareSDK.getPlatform(WechatMoments.NAME); 107 platform.setPlatformActionListener(this); 108 platform.share(sharePlatform); 109 } 110 /** 111 * 若是是微信分享 112 */ 113 else if(shareType.equalsIgnoreCase(ShareConfig.WeChatShare)){ 114 sharePlatform.setShareType(Platform.SHARE_WEBPAGE); 115 116 setSharePlatform(sharePlatform, shareTitle, shareText, shareImageUrl); 117 118 if(shareUrl!=null && !shareUrl.equalsIgnoreCase("")) { 119 sharePlatform.setUrl(shareUrl); 120 } 121 platform = ShareSDK.getPlatform(Wechat.NAME); 122 platform.setPlatformActionListener(this); 123 platform.share(sharePlatform); 124 } 125 /** 126 * 若是是QQ分享 127 */ 128 else { 129 setSharePlatform(sharePlatform, shareTitle, shareText, shareImageUrl); 130 131 if(shareUrl!=null && !shareUrl.equalsIgnoreCase("")) { 132 sharePlatform.setTitleUrl(shareUrl); 133 } 134 135 platform = ShareSDK.getPlatform(QQ.NAME); 136 platform.setPlatformActionListener(this); 137 platform.share(sharePlatform); 138 } 139 } 140 141 142 private void setSharePlatform(Platform.ShareParams sharePlatform,String shareTitle, String shareText, String shareImageUrl){ 143 sharePlatform.setTitle(shareTitle); 144 if(shareText!=null && !shareText.equalsIgnoreCase("")) { 145 sharePlatform.setText(shareText); 146 } 147 if(shareImageUrl!=null && !shareImageUrl.equalsIgnoreCase("")) { 148 sharePlatform.setImageUrl(shareImageUrl); 149 sharePlatform.setImagePath(shareImageUrl); 150 } 151 } 152 }
咱們在導航欄中只須要如此調用便可實現分享功能: