【0126】【项目实战】-【组件化封装思想实战Android App】-【9】App公共模块之社交分享组件
1 效果及第三方的选择
1.1 效果
【说明】多处使用到了分享的功能

1.2 思路及相关知识




1.3 平台的注册及环境的搭建


【环境配置的三个步骤】
【第一步】拷贝相应的类放在lib中;没有必要所有的都拷贝;


【第二步】配置xml文件;【shareSDK.xml文件的解析】


【第三步】在清单文件中配置,记得需要增加权限,可以参考下载的demo中的代码的配置;


2.分享Api的讲解
【初始化sdk】

【使用shareSDK的步骤及API】


3.对ShareSDK的封装
【封装的目标就是下面的代码】

3.1 ShareManager的封装


【对数据的封装】需要对数据和平台进行封装;



1 package com.youdu.share; 2 3 import android.content.Context; 4 5 import cn.sharesdk.framework.Platform; 6 import cn.sharesdk.framework.PlatformActionListener; 7 import cn.sharesdk.framework.ShareSDK; 8 import cn.sharesdk.tencent.qq.QQ; 9 import cn.sharesdk.tencent.qzone.QZone; 10 import cn.sharesdk.wechat.friends.Wechat; 11 import cn.sharesdk.wechat.moments.WechatMoments; 12 13 /** 14 * @author vision 15 * @function 分享功能统一入口,负责发送数据到指定平台,可以优化为一个单例模式 16 */ 17 18 public class ShareManager { 19 20 private static ShareManager mShareManager = null; 21 /** 22 * 要分享到的平台 23 */ 24 private Platform mCurrentPlatform; 25 26 /** 27 * 线程安全的单例模式 28 */ 29 public static ShareManager getInstance() { 30 if (mShareManager == null) { 31 synchronized (ShareManager.class) { 32 if (mShareManager == null) { 33 mShareManager = new ShareManager(); 34 } 35 } 36 } 37 return mShareManager; 38 } 39 40 private ShareManager() { 41 } 42 43 /** 44 * 第一个执行的方法,最好在程序入口入执行 45 * 46 * @param context 47 */ 48 public static void initSDK(Context context) { 49 ShareSDK.initSDK(context); 50 } 51 52 /** 53 * 分享数据到不同平台 54 */ 55 public void shareData(ShareData shareData, PlatformActionListener listener) { 56 switch (shareData.mPlatformType) { 57 case QQ: 58 mCurrentPlatform = ShareSDK.getPlatform(QQ.NAME); 59 break; 60 case QZone: 61 mCurrentPlatform = ShareSDK.getPlatform(QZone.NAME); 62 break; 63 case WeChat: 64 mCurrentPlatform = ShareSDK.getPlatform(Wechat.NAME); 65 break; 66 case WechatMoments: 67 mCurrentPlatform = ShareSDK.getPlatform(WechatMoments.NAME); 68 break; 69 default: 70 break; 71 } 72 mCurrentPlatform.setPlatformActionListener(listener); //由应用层去处理回调,分享平台不关心。 73 mCurrentPlatform.share(shareData.mShareParams); 74 } 75 76 /** 77 * 第三方用户授权信息获取 78 * 将获取到的用户信息发送到服务器 是 79 * 登陆流程:通过Aouth认证拿到第三方平台用户信息--------------------------------> 服务器判断是否绑定过本地帐号-------> 返回本地系统帐号信息登陆应用 80 * 81 * 否 82 * -------> 直接用第三方信息登陆应用(应用内可以提供绑定功能) 83 * 注意:1.第三方帐号与本地帐号的绑定关系是一一对应的(即一个QQ号绑定了本地帐号以后,同一用户的微信号也不能再绑定)。 84 * 2.绑定的过程其实就是一个使用第三方平台用户信息再自己服务器的一个再注册功能。 85 * 86 * @param type 第三方类型 87 * @param listener 事件回调处理 88 */ 89 public void getUserMsg(PlatofrmType type, PlatformActionListener listener) { 90 switch (type) { 91 case QQ: 92 case QZone: 93 /** 94 * 没有微信那么严格,测试环境下也可以正常登陆 95 */ 96 mCurrentPlatform = ShareSDK.getPlatform(QZone.NAME); 97 break; 98 case WeChat: 99 /** 100 * 微信第三方登陆条件:1.应用必须通过微信平台审核 2.开通了登陆功能(300一年) 3.测试的时候需要以签名包测试 101 * 必须同时满足以上三个条件才能登陆成功。 102 */ 103 mCurrentPlatform = ShareSDK.getPlatform(Wechat.NAME); 104 break; 105 } 106 mCurrentPlatform.setPlatformActionListener(listener); //用户信息回调接口 107 mCurrentPlatform.showUser(null); // 请求对应用户信息 108 } 109 110 /** 111 * 删除授权 112 */ 113 public void removeAccount() { 114 if (mCurrentPlatform != null) { 115 mCurrentPlatform.getDb().removeAccount(); 116 } 117 } 118 119 /** 120 * @author 应用程序需要的平台 121 */ 122 public enum PlatofrmType { 123 QQ, QZone, WeChat, WechatMoments; 124 } 125 }
3.2 UI层的封装
【源码】q0pwzp\Client_Code\app\src\main\java\com\youdu\share\ShareDialog.java
1 package com.youdu.share; 2 3 import android.app.Dialog; 4 import android.content.Context; 5 import android.os.Bundle; 6 import android.util.DisplayMetrics; 7 import android.util.Log; 8 import android.view.Gravity; 9 import android.view.View; 10 import android.view.Window; 11 import android.view.WindowManager; 12 import android.widget.RelativeLayout; 13 import android.widget.TextView; 14 import android.widget.Toast; 15 16 import com.youdu.R; 17 import com.youdu.constant.Constant; 18 import com.youdu.network.http.RequestCenter; 19 import com.youdu.okhttp.listener.DisposeDownloadListener; 20 21 import java.util.HashMap; 22 23 import cn.sharesdk.framework.Platform; 24 import cn.sharesdk.framework.PlatformActionListener; 25 26 public class ShareDialog extends Dialog implements View.OnClickListener { 27 28 private Context mContext; 29 private DisplayMetrics dm; 30 31 /** 32 * UI 33 */ 34 private RelativeLayout mWeixinLayout; 35 private RelativeLayout mWeixinMomentLayout; 36 private RelativeLayout mQQLayout; 37 private RelativeLayout mQZoneLayout; 38 private RelativeLayout mDownloadLayout; 39 private TextView mCancelView; 40 41 /** 42 * share relative 设定可以分享的内容;可以参考shareSDK中可以分享的内容类型; 43 */ 44 private int mShareType; //指定分享类型 45 private String mShareTitle; //指定分享内容标题 46 private String mShareText; //指定分享内容文本 47 private String mSharePhoto; //指定分享本地图片 48 private String mShareTileUrl; 49 private String mShareSiteUrl; 50 private String mShareSite; 51 private String mUrl; 52 private String mResourceUrl; 53 54 private boolean isShowDownload; 55 56 public ShareDialog(Context context, boolean isShowDownload) { 57 super(context, R.style.SheetDialogStyle); 58 mContext = context; 59 dm = mContext.getResources().getDisplayMetrics(); 60 this.isShowDownload = false; 61 } 62 63 @Override 64 protected void onCreate(Bundle savedInstanceState) { 65 super.onCreate(savedInstanceState); 66 setContentView(R.layout.dialog_share_layout); 67 initView(); 68 } 69 70 private void initView() { 71 /** 72 * 通过获取到dialog的window来控制dialog的宽高及位置 73 */ 74 Window dialogWindow = getWindow(); 75 dialogWindow.setGravity(Gravity.BOTTOM); 76 WindowManager.LayoutParams lp = dialogWindow.getAttributes(); 77 lp.width = dm.widthPixels; //设置宽度 78 dialogWindow.setAttributes(lp); 79 80 mWeixinLayout = (RelativeLayout) findViewById(R.id.weixin_layout); 81 mWeixinLayout.setOnClickListener(this); 82 mWeixinMomentLayout = (RelativeLayout) findViewById(R.id.moment_layout); 83 mWeixinMomentLayout.setOnClickListener(this); 84 mQQLayout = (RelativeLayout) findViewById(R.id.qq_layout); 85 mQQLayout.setOnClickListener(this); 86 mQZoneLayout = (RelativeLayout) findViewById(R.id.qzone_layout); 87 mQZoneLayout.setOnClickListener(this); 88 mDownloadLayout = (RelativeLayout) findViewById(R.id.download_layout); 89 mDownloadLayout.setOnClickListener(this); 90 if (isShowDownload) { 91 mDownloadLayout.setVisibility(View.VISIBLE); 92 } 93 mCancelView = (TextView) findViewById(R.id.cancel_view); 94 mCancelView.setOnClickListener(this); 95 } 96 97 public void setResourceUrl(String resourceUrl) { 98 mResourceUrl = resourceUrl; 99 } 100 101 public void setShareTitle(String title) { 102 mShareTitle = title; 103 } 104 105 public void setImagePhoto(String photo) { 106 mSharePhoto = photo; 107 } 108 109 public void setShareType(int type) { 110 mShareType = type; 111 } 112 113 public void setShareSite(String site) { 114 mShareSite = site; 115 } 116 117 public void setShareTitleUrl(String titleUrl) { 118 mShareTileUrl = titleUrl; 119 } 120 121 public void setUrl(String url) { 122 mUrl = url; 123 } 124 125 public void setShareSiteUrl(String siteUrl) { 126 mShareSiteUrl = siteUrl; 127 } 128 129 public void setShareText(String text) { 130 mShareText = text; 131 } 132 133 @Override 134 public void onClick(View v) { 135 switch (v.getId()) { 136 case R.id.weixin_layout: 137 shareData(ShareManager.PlatofrmType.WeChat); 138 break; 139 case R.id.moment_layout: 140 shareData(ShareManager.PlatofrmType.WechatMoments); 141 break; 142 case R.id.qq_layout: 143 shareData(ShareManager.PlatofrmType.QQ); 144 break; 145 case R.id.qzone_layout: 146 shareData(ShareManager.PlatofrmType.QZone); 147 break; 148 case R.id.cancel_view: 149 dismiss(); 150 break; 151 case R.id.download_layout: 152 //检查文件夹是否存在 153 RequestCenter.downloadFile(mResourceUrl, 154 Constant.APP_PHOTO_DIR.concat(String.valueOf(System.currentTimeMillis())), 155 new DisposeDownloadListener() { 156 @Override 157 public void onSuccess(Object responseObj) { 158 Toast.makeText(mContext, 159 mContext.getString(R.string.download_success), 160 Toast.LENGTH_SHORT) 161 .show(); 162 } 163 164 @Override 165 public void onFailure(Object reasonObj) { 166 Toast.makeText(mContext, 167 mContext.getString(R.string.download_failed) + mResourceUrl, 168 Toast.LENGTH_SHORT) 169 .show(); 170 } 171 172 @Override 173 public void onProgress(int progrss) { 174 Log.e("dialog", progrss + "XX"); 175 } 176 }); 177 break; 178 } 179 } 180 181 /** 182 * 分享结果的事件监听 183 */ 184 private PlatformActionListener mListener = new PlatformActionListener() { 185 @Override 186 public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) { 187 } 188 189 @Override 190 public void onError(Platform platform, int i, Throwable throwable) { 191 } 192 193 @Override 194 public void onCancel(Platform platform, int i) { 195 } 196 }; 197 198 //完成分享的方法 199 private void shareData(ShareManager.PlatofrmType platofrm) { 200 //封装分享的数据 201 ShareData mData = new ShareData(); 202 Platform.ShareParams params = new Platform.ShareParams(); 203 params.setShareType(mShareType); 204 params.setTitle(mShareTitle); 205 params.setTitleUrl(mShareTileUrl); 206 params.setSite(mShareSite); 207 params.setSiteUrl(mShareSiteUrl); 208 params.setText(mShareText); 209 params.setImagePath(mSharePhoto); 210 params.setUrl(mUrl); 211 mData.mPlatformType = platofrm; 212 mData.mShareParams = params; 213 //【核心】调用shareManager 完成数据的分享; 214 ShareManager.getInstance().shareData(mData, mListener); 215 } 216 }
4.分享功能的使用




浙公网安备 33010602011771号