微信文件分享的那些坑

最近因为公司的项目要求,需要做的一件事情就是将本App的文件分享给微信好友。遇到这种需求的第一件事肯定是进入微信开放平台查看微信分享的文档(微信分享),不看还好,看了顿时会有一种想骂人的感觉,因为文档里面根本就没有所谓的文件分享,明确告诉了我们微信分享及收藏目前支持文字、图片、音乐、视频、网页共五种类型。是不是有一万头草泥马在你脑海里奔腾而过?不过没关系,微信和支付宝的文档坑应该大家早有耳闻,文档没有的东西,大家就应该通过强大的百度或者谷歌进行搜索了,相信这应该是大家的强项。
各种搜索之后,终于被我找到了微信分享的SDK里面还有一个WXFileObject,看到这个类,相信大家可以长呼一口气了,不过别者急,你才刚开始入坑,让我们首先来看第一种方式:

private void ShareFileToWeiXin() {    
       WXFileObject fileObj = new WXFileObject();    
       fileObj.fileData = WXUtil.inputStreamToByte(ALBUM_PATH+OKFileName);//文件路径    
       fileObj.filePath = ALBUM_PATH + OKFileName ;    

       //使用媒体消息分享    
       WXMediaMessage msg = new WXMediaMessage(fileObj);    
       msg.title = "title";    

       //发送请求    
       SendMessageToWX.Req req = new SendMessageToWX.Req();    
       //创建唯一标识    
       req.transaction = String.valueOf(System.currentTimeMillis());    
       req.message = msg;    
       req.scene = SendMessageToWX.Req.WXSceneSession;    

       wxapi.sendReq(req);    
   } 

这种方式是会同时将文件的路径以及将文件转化的byte[]数组分享给微信好友,这种方式看起来是可以的,而且使用的时候在某些情况下也是可行的,某些情况下是指分享一些小文件(小于1M),如果我们刚才拿的是一个小文件进行测试,你会你觉得自己写的很不错,会想着这功能也不过如此,然后信心满满的拿给测试去测。但是问题马上就会来了,当测试测过几轮之后,就会发现分享大文件的时候微信调不出来,这时候我想你就该蛋疼了。于是开始各种百度,或者去看文档里面的常见问题,里面的确提到了不能正常调起微信的几种情况


image.png

仔细的看上面的代码,你会发现我们根本就没有发送缩略图,然后你会想着把其他的几种情况都试一遍。试了几遍之后,你会发现都不管用,这时候我想你都快奔溃了吧,这时候你可能又会想起AndroidStudio可以看源码,于是你又去看WXFileObject源码。源码如下


image.png

相信你一眼就能看到CONTENT_LENGTH_LIMIT =10485760(10M),很负责任的告诉大家,这个的确是限制分享文件大小的,但是你可能就会更奇怪了,我明明分享的是10M之内,为啥不可以,这时候你有没有开始心里骂微信了,这是什么鬼。可能这时你又会仔细的去看微信分档里面的其他示例。
看过几次之后,相信我们会看到网页分享URL这块,这时我们就应该想到,既然网页Url可以分享,那我可不可以直接分享文件的地址,这时聪明的你如果把fileObj.fileData = WXUtil.inputStreamToByte(ALBUM_PATH+OKFileName);这句话给注释掉,重新编译,我们就会发现神奇的事情发生了,微信马上就被调起了,是不是感觉很惊奇?好吧,有时候事情就是这样,多此一举导致坑了自己,直接分享我的源码吧
WXFileObject fileObject = new WXFileObject();
                        fileObject.setContentLengthLimit(1024 * 1024 * 10);
                        fileObject.setFilePath(filePath + "/" + fileName);//设置文件本地地址
                        WXMediaMessage msg = new WXMediaMessage();
                        msg.mediaObject = fileObject;
                        msg.title = fileName;

                        SendMessageToWX.Req req = new SendMessageToWX.Req();
                        req.transaction = buildTransaction("file");
                        req.message = msg;
                        req.scene = mTargetScene;
                        LogUtils.i("SendToWXActivity", "mTargetScene---" + buildTransaction("file") + "---" + msg);
                        api.sendReq(req);

好了,写了半天,可能很多废话,多多包涵吧,有啥想交流的,欢迎给我评论。

你可能感兴趣的:(微信文件分享的那些坑)