【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.分享功能的使用

 

 

 

posted @ 2018-04-18 10:12  OzTaking  阅读(588)  评论(0)    收藏  举报