关于ShareSDK第三方分享 —— 记录

从上班开始就一直忙着加班,项目上线,稍微清闲,整理一下之前三个来月的项目中使用的第三方分享

首先根据mob官方文档做好基本配置,包名签名要记得一致


导入官方的onekeyshare

ShareView是我们的自定义布局  一个GridLayout +一个view取消按钮

public class ShareView extends LinearLayout {

    private Context mContext;
    private GridLayout mGridLayout;
    private TextView cancle;
    private float paddingValue;

    private ArrayList<ShareItemEntity> entitys = new ArrayList<>();
    private ShareHelper shareHelper;

    public ShareView(Context context) {
        this(context, null);
    }

    public ShareView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ShareView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        DisplayMetrics dm = getResources().getDisplayMetrics();

        paddingValue = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, paddingValue, dm);

        this.mContext = context;

        init();
    }

    private void init() {
        LayoutInflater.from(mContext).inflate(R.layout.share_dialog, this);
        mGridLayout = (GridLayout) findViewById(R.id.share_dialog_grid);
        cancle = (TextView) findViewById(R.id.share_dialog_cancle);
        setOrientation(VERTICAL);
    }

    /**
     * 设置分享子Item的点击事件 Method name: setShareItemClick <BR>
     * Description: setShareItemClick <BR>
     */
    public void setShareResult(final ShareResult shareResult) {
        shareHelper = new ShareHelper(mContext, shareResult);
        mGridLayout.setGridLayoutItemListener(new GridLayout.GridLayoutItemListener() {
            @Override
            public boolean onItemLongClick(View view, int position) {
                return false;
            }

            @Override
            public void onItemClick(View view, int position) {
                ShareItemEntity entity = (ShareItemEntity) view.getTag();
                if (null != entity) {
                    switch (entity.getMethod()) {
                        case weixin:
                            shareHelper.sendToWx();
                            break;
                        case weixin_circle:
                            shareHelper.sendWxCircle();
                            break;
                        case qq:
                            shareHelper.sendQQ();
                            break;
                        case qzone:
                            shareHelper.sendQQZone();
                            break;
                        case sina_weibo:
                            shareHelper.sendSina();
                            break;
                        case more:
                            shareResult.onShareMore();
                            ToastUtil.show("链接已复制");
                            break;
                        default:
                            break;
                    }
                }
            }
        });
    }

    public void setCancleBtnOnClick(OnClickListener clickListener) {
        cancle.setOnClickListener(clickListener);
    }

    public TextView getCancle() {
        return cancle;
    }

    /**
     * 添加微信 Method name: addShareWx <BR>
     * Description: addShareWx <BR>
     * void<BR>
     */
    public void addShareWx() {
        ShareItemEntity entity = new ShareItemEntity();
        entity.setName("微信");
        entity.setImgRes(R.drawable.icon_share_wx);
        entity.setPlatform(ShareSDK.getPlatform(ShareHelper.Wechat));
        entity.setMethod(ShareHelper.SHARE_METHOD.weixin);

        mGridLayout.addView(getShareItem(entity));
    }

    /**
     * 添加新浪微博 Method name: addShareSina <BR>
     * Description: addShareSina <BR>
     * void<BR>
     */
    public void addShareSina() {
        ShareItemEntity entity = new ShareItemEntity();
        entity.setName("新浪微博");
        entity.setImgRes(R.drawable.icon_share_sina);
        entity.setPlatform(ShareSDK.getPlatform(ShareHelper.SinaWeibo));
        entity.setMethod(ShareHelper.SHARE_METHOD.sina_weibo);
        mGridLayout.addView(getShareItem(entity));
    }

    /**
     * 添加朋友圈 Method name: addShareWxCircle <BR>
     * Description: addShareWxCircle <BR>
     * void<BR>
     */
    public void addShareWxCircle() {
        ShareItemEntity entity = new ShareItemEntity();
        entity.setName("朋友圈");
        entity.setImgRes(R.drawable.icon_share_wechatmoents);
        entity.setPlatform(ShareSDK.getPlatform(ShareHelper.WechatMoments));
        entity.setMethod(ShareHelper.SHARE_METHOD.weixin_circle);
        mGridLayout.addView(getShareItem(entity));
    }

    /**
     * 添加QQ Method name: addShareQQ <BR>
     * Description: addShareQQ <BR>
     * void<BR>
     */
    public void addShareQQ() {
        ShareItemEntity entity = new ShareItemEntity();
        entity.setName("QQ");
        entity.setImgRes(R.drawable.icon_share_qq);
        entity.setPlatform(ShareSDK.getPlatform(ShareHelper.QQ));
        entity.setMethod(ShareHelper.SHARE_METHOD.qq);
        mGridLayout.addView(getShareItem(entity));
    }

    /**
     * 添加QQ空间 Method name: addShareQQZone <BR>
     * Description: addShareQQZone <BR>
     * void<BR>
     */
    public void addShareQQZone() {
        ShareItemEntity entity = new ShareItemEntity();
        entity.setName("QQ空间");
        entity.setImgRes(R.drawable.icon_share_qzone);
        entity.setPlatform(ShareSDK.getPlatform(ShareHelper.QQZone));
        entity.setMethod(ShareHelper.SHARE_METHOD.qzone);
        mGridLayout.addView(getShareItem(entity));
    }
//复制链接
    public void addShareCopy() {
        ShareItemEntity entity = new ShareItemEntity();
        entity.setName("复制链接");
        entity.setImgRes(R.drawable.icon_share_copy);
        entity.setMethod(ShareHelper.SHARE_METHOD.more);
        mGridLayout.addView(getShareItem(entity));
    }

    /**
     * 得到子Item Method name: getShareItem <BR>
     * Description: getShareItem <BR>
     *
     * @param shareItemEntity
     * @return ShareItemView<BR>
     */
    private ShareItemView getShareItem(ShareItemEntity shareItemEntity) {
        ShareItemView itemView = new ShareItemView(mContext);
        int width = (int) ((DeviceUtil.getScreenWidth() - paddingValue) / 4); // 估算每个item的宽
        itemView.setData(shareItemEntity.getImgRes(), shareItemEntity.getName());
        itemView.setViewWidth(new GridLayout.LayoutParams(), width);
        itemView.setTag(shareItemEntity);
        return itemView;
    }
}




ShareItemView
public class ShareItemView extends LinearLayout {

    private Context context;
    private RelativeLayout item_rl;
    private ImageView item_iv;
    private TextView item_tv;

    public ShareItemView(Context context) {
        this(context, null);
    }

    public ShareItemView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ShareItemView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
        bindViews(context);
    }

    private void bindViews(Context context) {
        LayoutInflater.from(context).inflate(R.layout.share_item_view, this);
        item_rl = (RelativeLayout) findViewById(R.id.share_item_view_rl);
        item_iv = (ImageView) findViewById(R.id.share_item_view_iv);
        item_tv = (TextView) findViewById(R.id.share_item_view_tv);
        item_rl.setBackgroundResource(R.drawable.selector_default_click);
    }

    public ImageView getItem_plate__iv() {
        return item_iv;
    }

    /**
     * 设置数据,本地图片 Method name: setData <BR>
     * Description: setData <BR>
     *
     * @param imgRes
     * @param name   void<BR>
     */
    public void setData(int imgRes, String name) {
        item_iv.setImageResource(imgRes);
        item_tv.setText(name);
        item_iv.setBackgroundResource(android.R.color.transparent);
    }

    public void setText(String text) {
        item_tv.setText(text);
    }

    /**
     * 设置ImageView的宽与高 Method name: setImageWidth <BR>
     * Description: setImageWidth <BR>
     *
     * @param width void<BR>
     */
    public void setImageWidth(int width) {
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width, width);
        layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
        layoutParams.topMargin = width / 4;
        item_iv.setLayoutParams(layoutParams);


        RelativeLayout.LayoutParams layoutParamsTv = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        layoutParamsTv.addRule(RelativeLayout.CENTER_HORIZONTAL);
        layoutParamsTv.addRule(RelativeLayout.BELOW, R.id.share_item_view_iv);
        layoutParamsTv.topMargin = width / 8;
        item_tv.setLayoutParams(layoutParamsTv);
    }

    /**
     * 设置整个View的宽高 Method name: setViewWidth <BR>
     * Description: setViewWidth <BR>
     *
     * @param layoutParams
     * @param width        void<BR>
     */
    public void setViewWidth(ViewGroup.LayoutParams layoutParams, int width) {
        layoutParams.width = width;
        layoutParams.height = width;
        setLayoutParams(layoutParams);
        setImageWidth(width / 2);

    }

    public void setData(ShareItemEntity itemEntity) {
        item_iv.setImageResource(itemEntity.getImgRes());
        item_iv.setBackgroundResource(android.R.color.transparent);
        item_tv.setText(itemEntity.getPlatform().getName());
    }
/**
 * 分享的弹框 
 */
public class ShareDialog extends BottomBaseDialog<ShareDialog> {

    private ShareResult mShareCallback;
    private Context mContext;
    private ShareView mShareView;

    public ShareDialog(Context context, View animateView) {
        super(context, animateView);
    }

    public ShareDialog(Context context, ShareResult shareCallback) {
        super(context);
        this.mContext = context;
        this.mShareCallback = shareCallback;
    }

    @Override
    public View onCreateView() {
        mShareView = new ShareView(mContext);
        setCancelable(true);
        return mShareView;
    }

    @Override
    public void setUiBeforShow() {
        mShareView.setBackgroundResource(android.R.color.white);
        mShareView.setCancleBtnOnClick(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
        mShareView.setShareResult(mShareCallback);
    }

    public ShareDialog addWx() {
        mShareView.addShareWx();
        return this;
    }

    public ShareDialog addWxCircle() {
        mShareView.addShareWxCircle();
        return this;
    }

    public ShareDialog addQQ() {
        mShareView.addShareQQ();
        return this;
    }

    public ShareDialog addQQZone() {
        mShareView.addShareQQZone();
        return this;
    }

    public ShareDialog addSina() {
        mShareView.addShareSina();
        return this;
    }

    public ShareDialog addShareCopy() {
        mShareView.addShareCopy();
        return this;
    }

    public ShareDialog addAll() {
        addWx();
        addWxCircle();
        addSina();
        addQQ();
        addQQZone();
        addShareCopy();
        return this;
    }
}

public class ShareHelper {

    public static String Wechat = "Wechat";
    public static String WechatMoments = "WechatMoments";
    public static String QQ = "QQ";
    public static String QQZone = "QZone";
    public static String SinaWeibo = "SinaWeibo";

    private Context mContext;
    private ShareResult shareResult;
    private PlatformActionListener platformActionListener = new PlatformActionListener() {
        @Override
        public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
            if (null != shareResult) {
                shareResult.onShareSuccess(platform);
            }
            LogUtil.d(platform.getName() + "--" + i);
            ToastUtil.show("分享成功");
        }

        @Override
        public void onError(Platform platform, int i, Throwable throwable) {
            if (null != shareResult) {
                shareResult.onShareError(platform);
            }
            LogUtil.e(throwable.getMessage() + "--" + i);
            ToastUtil.show("分享失败");
        }

        @Override
        public void onCancel(Platform platform, int i) {
            if (null != shareResult) {
                shareResult.onShareCancel(platform);
            }

            LogUtil.e(platform.getName() + "--" + i);
        }
    };
    private ShareParam shareParam;

    public ShareHelper(Context context, ShareResult shareResult) {
        this.mContext = context;
        this.shareResult = shareResult;
    }
    //加参数是为了区分平台(我们的需求里是微博分享内容要加个url)
    private void initShareParam(Platform platform) {
        shareParam = shareResult.getShareParam(platform);
        if (null == shareParam) {
            shareParam = shareResult.getShareParam();
        }
    }

    public void sendQQ() {
        Platform platform = ShareSDK.getPlatform(QQ);
        initShareParam(platform);
        if (platform.isClientValid()) { //isClientValid() 判断有没有安装客户端,没有不显示或者提示安装
            QQ.ShareParams sp = new QQ.ShareParams();
            sp.setTitle(shareParam.getTitle());
            sp.setTitleUrl(shareParam.getTitleUrl()); // 标题的超链接
            sp.setText(shareParam.getText());
            if (shareParam.isImageLocal()) {
                sp.setImagePath(shareParam.getImageUrl());
            } else {
                sp.setImageUrl(shareParam.getImageUrl());
            }
            platform.setPlatformActionListener(platformActionListener); // 设置分享事件回调
            platform.share(sp);
        }else {
            ToastUtil.show(ResourceUtil.getString(R.string.ssdk_qq_client_inavailable));
        }
    }

    public void sendQQZone() {
        Platform platform = ShareSDK.getPlatform(QQZone);
        initShareParam(platform);
        if (platform.isClientValid()) {
            cn.sharesdk.tencent.qzone.QZone.ShareParams sp = new QZone.ShareParams();
            sp.setTitle(shareParam.getTitle());
            sp.setTitleUrl(shareParam.getTitleUrl()); // 标题的超链接
            sp.setText(shareParam.getText());
            if (shareParam.isImageLocal()) {
                sp.setImagePath(shareParam.getImageUrl());
            } else {
                sp.setImageUrl(shareParam.getImageUrl());
            }
            sp.setSite(shareParam.getSite());
            sp.setSiteUrl(shareParam.getSiteUrl());

            platform.setPlatformActionListener(platformActionListener); // 设置分享事件回调
            platform.share(sp);
        }else {
            ToastUtil.show(ResourceUtil.getString(R.string.ssdk_qq_client_inavailable));
        }
    }

    public void sendToWx() {
        Platform platform = ShareSDK.getPlatform(Wechat);
        initShareParam(platform);
        if (platform.isClientValid()) {
            final Wechat.ShareParams sp = new Wechat.ShareParams();
            sp.setShareType(Platform.SHARE_WEBPAGE);//微信分享网页要设置类型,微信单独在这边设置!!!!!!
            sp.setTitle(shareParam.getTitle());
            sp.setText(shareParam.getText());
            Glide.with(mContext).load(shareParam.getImageUrl()).asBitmap().into(new SimpleTarget<Bitmap>() {
                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                    sp.setImageData(resource);
                }

            }); //方法中设置asBitmap可以设置回调类型
            sp.setUrl(shareParam.getToUrl());

            platform.setPlatformActionListener(platformActionListener); // 设置分享事件回调
            platform.share(sp);
        }else {
            ToastUtil.show(ResourceUtil.getString(R.string.ssdk_wechat_client_inavailable));
        }
    }

    public void sendWxCircle() {
        Platform platform = ShareSDK.getPlatform(WechatMoments);
        initShareParam(platform);
        if (platform.isClientValid()) {
            final cn.sharesdk.wechat.moments.WechatMoments.ShareParams sp = new WechatMoments.ShareParams();
            sp.setShareType(Platform.SHARE_WEBPAGE);//微信分享网页要设置类型,微信单独在这边设置!!!!!!
            sp.setTitle(shareParam.getTitle());
            sp.setText(shareParam.getText());
            Glide.with(mContext).load(shareParam.getImageUrl()).asBitmap().into(new SimpleTarget<Bitmap>() {
                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                    sp.setImageData(resource);
                }

            });
            sp.setUrl(shareParam.getToUrl());
            platform.setPlatformActionListener(platformActionListener); // 设置分享事件回调
            platform.share(sp);
        }else {
            ToastUtil.show(ResourceUtil.getString(R.string.ssdk_wechat_client_inavailable));
        }
    }

    public void sendSina() {
        Platform platform = ShareSDK.getPlatform(SinaWeibo);
        initShareParam(platform);
        if (platform.isClientValid()) {
            cn.sharesdk.sina.weibo.SinaWeibo.ShareParams sp = new SinaWeibo.ShareParams();
            sp.setTitle(shareParam.getTitle());
            sp.setText(shareParam.getText());
            if (shareParam.isImageLocal()) {
                sp.setImagePath(shareParam.getImageUrl());
            } else {
                sp.setImageUrl(shareParam.getImageUrl());
            }
            platform.removeAccount(true);
            ShareSDK.removeCookieOnAuthorize(true);
            platform.SSOSetting(true);
            platform.setPlatformActionListener(platformActionListener); // 设置分享事件回调
            platform.share(sp);
        }else {
            ToastUtil.show(ResourceUtil.getString(R.string.ssdk_sina_client_inavailable));
        }
    }
    
    public enum SHARE_METHOD {
        weixin, weixin_circle, sina_weibo, tecent_weibo, sms, qq, qzone, more;
    }
}


/**
 * 分享回调
 */
public abstract class ShareResult {

    public abstract ShareParam getShareParam();

    public ShareParam getShareParam(Platform platform) {

        return null;
    }

    /**
     * 分享成功
     *
     * @param platform
     */
    public void onShareSuccess(Platform platform) {

    }

    /**
     * 分享失败
     *
     * @param platform
     */
    public void onShareError(Platform platform) {

    }

    /**
     * 取消分享
     *
     * @param platform
     */
    public void onShareCancel(Platform platform) {

    }

    /**
     * 复制
     */
    public void onShareMore() {

    }

}

分享图片,有时候会需要分享我们的logo,就分享本地图片

        //将drawable存到本地--网上找的,自己还不是很会,得记住啊
                Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
                String filename = MConfiguration.getImageCachePath() + "ic_launcher" + UUID.randomUUID().toString() + ".jpg";
                FileOutputStream out = null;
                try {
                    out = new FileOutputStream(filename);
                    bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
                } catch (Exception e) {
                } finally {
                    try {
                        if (out != null)
                            out.flush();
                    } catch (IOException e) {
                    }
                    try {
                        if (out != null)
                            out.close();
                    } catch (IOException e) {
                    }
                    out = null;
                }
                ShareParam shareParam = new ShareParam();
                shareParam.setImageUrl(filename);//---放logo




总结一下我的问题:

最开始就不知道怎么回事就是分享不出去,事实上是AppKey和Appsecret  还有安卓包名签名的问题,大家配置要好好检查一下,
出现闪一下就是签名问题,或者没打正式包
微信分享不了:
1、测试没有打包(用keystroke打包apk)
2、打包的keystore跟微信开放平台上面的不一致, 导致MD5码不一致(微信开放平台填写的是MD5,ps: 填写到微信开放平台 然后把MD5中的 大写字母改成小写字母 冒号去掉)
3、分享参数错误(微信有分享类型的详情参考:http://wiki.mob.com/%e4%b8%8d%e5%90%8c%e5%b9%b3%e5%8f%b0%e5%88%86%e4%ba%ab%e5%86%85%e5%ae%b9%e7%9a%84%e8%af%a6%e7%bb%86%e8%af%b4%e6%98%8e/)
4、应用没有审核通过
5、包名跟开放平台上面的不一致
6:没有在在mob.com申请key!
7:修改签名会在微信客户端有缓存的,要卸载重新安装微信客户端重新安装,微信开放平台修改签名有时候会延迟刷新,

微信分享文字图片  是绕过审核就能分享,但是要分享url就必须通过审核,就他BypassApproval="false" 

如果你下按照文档操作,选择分享平台,不小心选择多了,有你不想要的,直接删除libs下jar包就好 build.gradle里也删掉

新浪微博开发者平台---应用信息--高级信息--OAuth2.0授权设置,授权回调页 和我们ShareSDK.xml  RedirectUrl="https://api.weibo.com/oauth2/default.html"里要一致

如果有什么问题,最先就检查一下签名等配置,官方的没什么大问题,有也是我们操作有遗漏

http://blog.csdn.net/virgo826627/article/details/50996060

还有微博分享错误码,我遇到短时间分享相同的内容的错误(微博不允许短时间内重复分享 ),就是测试分享次数太多了,自己对应看下吧~~~   http://open.weibo.com/wiki/Error_code

如果,手机没装客户端,你判断提示用户安装,对,就是他   platform.isClientValid()找到判断一下
eg.   在Activity 里 判断微信平台      finalPlatform platform = ShareSDK.getPlatform(this, Wechat.NAME);

最后一个问题就是,分享到微信好友,shareParam.setTitle("要分享的标题");就几个字,会显示两遍,mob官方客服告诉,这个是微信控制的,我们改不了,那这个只能这样了


综上,是我遇到的所有问题的总结吧~~弄个分享,出来这么多问题,也是没谁了,菜鸟一枚,写出来,供大家参考




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值