使用shareSDK实现微信多图分享到朋友圈&Url分享到朋友圈&URL分享到好友 问题记录

标签: 微信分享  shareSDK  多图分享  异常

问题概述

其实第三方分享很早就有了,这个按理说这个应该没什么难度,为啥记录一下呢,因为项目中同时出现了 朋友圈多图分享(多张URL集合),朋友圈URL分享,群和个人URL,图片分享。基本上涵盖了大部分需求,这其中出现了一些问题,在此记录一下。

基本操作流程:

操作流程项目过程:http://wiki.mob.com/android-sharesdk%E5%AE%8C%E6%95%B4%E7%9A%84%E9%9B%86%E6%88%90%E6%96%87%E6%A1%A3/

大致流程就是
1. 注册ShareSDK账户,获取app key,app screct。
2. 注册你需要分享的所有平台信息,像QQ,微信,微博等等你必须的
3. 在自己项目中添加应用信息
1. 【优先级最高】使用ShareSDK后台直接配置
2. 【优先级中】使用代码配置”setPlatformDevInfo(String,HashMap

多图分享效果

如果是IOS,直接多图分享到微信客户端是不支持的,而Android客户端也是需要通过不验证的方式才能通过的,你在官方文档上可以查看说明:官网说明
这里写图片描述

如果你也想设置多图分享,那么需要如下代码:

 /**
     * 图片列表分享到微信朋友圈
     * @param desc
     * @param imageList
     * @param listener
     */
    public static void shareWeChatImageListComments(String desc, String[] imageList , PlatformActionListener listener) {
        HashMap<String,Object> optionMap = new HashMap<>();
        optionMap.put("Id","5");
        optionMap.put("SortId","5");
        optionMap.put("AppId","your app id");
        optionMap.put("AppSecret","your app secret");
        optionMap.put("BypassApproval",true);
        optionMap.put("Enable",true);
        ShareSDK.setPlatformDevInfo(WechatMoments.NAME,optionMap);

        Platform platform = ShareSDK.getPlatform(WechatMoments.NAME);
        Platform.ShareParams shareParams = new  Platform.ShareParams();
        shareParams.setText(desc);
        shareParams.setImageArray(imageList);
        shareParams.setShareType(Platform.SHARE_IMAGE);
        platform.setPlatformActionListener(listener);
        platform.share(shareParams);
    }

最主要的就是这个代码:

optionMap.put("BypassApproval",true);

它的意思是微信和朋友圈绕过审核的方式支持多图分享,ImageArray是String类型的数组,可传入手机本地图片路径和图片链接。
大致结果如下:
这里写图片描述

分享URL到朋友圈

如果你的app中同时存在多图朋友圈分享和URL朋友圈分享,那么此时URL分享时,BypassApproval属性需要设置成false(即必须通过审核才能分享),基本代码如下:

    /**
     * URL分享到微信朋友圈
     * @param url 跳转的URL
     * @param imageUrl 图片上展示的URL
     * @param title 分享简介的title
     * @param content 分享简介上内容
     * @param mListener 分享监听器
     */
    public static void shareWeChatMomments(String url, String imageUrl, String title, String content,  PlatformActionListener mListener) {
        HashMap<String,Object> optionMap = new HashMap<>();
        optionMap.put("Id","5");
        optionMap.put("SortId","5");
        optionMap.put("AppId","your app id");
        optionMap.put("AppSecret","your app secret");
        optionMap.put("BypassApproval",false);
        optionMap.put("Enable",true);
        ShareSDK.setPlatformDevInfo(WechatMoments.NAME,optionMap);

        Platform platform = ShareSDK.getPlatform(WechatMoments.NAME);
        Platform.ShareParams shareParams = new Platform.ShareParams();

        shareParams.setShareType(Platform.SHARE_WEBPAGE);
        shareParams.setTitle(title);
        shareParams.setTitleUrl(url);
        shareParams.setText(content);
        shareParams.setUrl(url);

        shareParams.setImageUrl(imageUrl);

        platform.setPlatformActionListener(mListener);
        platform.share(shareParams);
    }

如果你将BypassApproval还是设置为true,那么就会产生如下异常,程序将崩溃:
这里写图片描述

URL分享到给朋友

这个原本是最简单的分享格式,但是由于我们最初为了做多图分享,在shareSDK.xml文档中对微信设置了绕开审核,即

optionMap.put("BypassApproval",true);

如下图:
这里写图片描述
然后我的分享代码是这样的:

Platform platform = ShareSDK.getPlatform(Wechat.NAME);
Platform.ShareParams shareParams = new  Platform.ShareParams();
shareParams.setTitle("share title");
shareParams.setText("share content");
shareParams.setImageUrl("http://dev.e-shigong.com/ic_launcher.png");
shareParams.setUrl(share url);

shareParams.setShareType(Platform.SHARE_WEBPAGE);
platform.setPlatformActionListener(mListener);
platform.share(shareParams);

然后分享出来的结果是:

配置错误的分享 配置正确的分享
这里写图片描述 这里写图片描述

我一直认为是我们的appId和AppSecret配置得有问题,后来在咨询mob相关人员之后,只需要把
optionMap.put("BypassApproval",true);该为optionMap.put("BypassApproval",false); 即可。
详细代码如下:

 public static void shareWebpager(String title ,String shareUrl,String shareIcon, String content ,PlatformActionListener mListener){
        HashMap<String,Object> optionMap = new HashMap<>();
        optionMap.put("Id","5");
        optionMap.put("SortId","5");
        optionMap.put("AppId","your app id ");
        optionMap.put("AppSecret","your app secret");
        optionMap.put("BypassApproval",false);
        optionMap.put("Enable",true);
        ShareSDK.setPlatformDevInfo(Wechat.NAME,optionMap);


        Platform platform = ShareSDK.getPlatform(Wechat.NAME);
        Platform.ShareParams shareParams = new  Platform.ShareParams();
        shareParams.setTitle(title);
        shareParams.setText(content);
        shareParams.setImageUrl(shareIcon);
        shareParams.setUrl(shareUrl);

        shareParams.setShareType(Platform.SHARE_WEBPAGE);
        platform.setPlatformActionListener(mListener);
        platform.share(shareParams);
    }

后记

微信在做分享的时候,有几个地方比较坑,这里记录一下:
1. 分享的类型不同,对参数的要求也不一样,一定要严格对比,否则不能调用微信客户端;
2. 你使用测试版本时,需要用到微信注册时的签名(keystore)去打包,然后分享出错;
3. 如果测试时,第一次分享使用了错误的签名,那么接下来微信都会使用错误的签名,除非你清理微信缓存和重装微信。为此,个人的建议是你测试使用模拟器测试分享,即使错误了,直接重装微信再次测试。

原文链接:加载失败,请重新获取