微信分享大图遇到的问题(Android)
起因:
要做一个微信图片分享的功能,但是对于大图会如下问题:

当时没有仔细查看错误日志,单纯的以为是图片太大的问题。
分享图片代码:
public void WXsharePic(String transaction, final boolean isSession, Bitmap bitmap) {
//初始化WXImageObject和WXMediaMessage对象
WXImageObject imageObject = new WXImageObject(bitmap);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imageObject;
//设置缩略图
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, true);
bitmap.recycle();
msg.thumbData = getBitmapByte(scaledBitmap);
//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = transaction + Long.toString(System.currentTimeMillis());
req.message = msg;
//表示发送给朋友圈 WXSceneTimeline 表示发送给朋友 WXSceneSession
req.scene = isSession ? SendMessageToWX.Req.WXSceneSession : SendMessageToWX.Req.WXSceneTimeline;
//调用api接口发送数据到微信
api.sendReq(req);
}
解决过程:
想法一:
查看微信的文档,发现如下信息:

初步判定是略缩图过大导致的,准备对略缩图进一步压缩。
但是在调试过程中发现略缩图并没有超过32K,于是这种想法不正确。
想法二:
既然不是略缩图过大,那大概率就是原图过大了。然而微信官方文档上也没有说明原图大小限制,所以也不知道是否是这个原因。
于是准备测试一下是否是这个原因,对原图进一步压缩。
public static byte[] bitmap2Bytes(Bitmap bitmap, int maxkb) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
int options = 100;
while (output.toByteArray().length > maxkb&& options != 10) {
output.reset(); //清空output
bitmap.compress(Bitmap.CompressFormat.JPEG, options, output);//这里压缩options%,把压缩后的数据存放到output中
options -= 10;
}
return output.toByteArray();
}
从代码可知,设置了一个最大kb值,并每次循环压缩率递减10%.
然而实际运行中发现无论maxkb设置的多小,还是会出这个问题。
仔细调试发现,原图大小为3M多,即使是最小10%的压缩率也过大了。
于是将压缩率递减改为1%.
将压缩率递减改为1%,并且maxkb设置为500KB时,就没问题了!
但是,有两个很严重的问题:
1.微信的原图最大只能是500KB吗?
2.循环压缩所需时间太久,差不多半分钟才能压缩完毕,效率太低。
想法三:
这个时候,我才开始注意起错误日志来。
错误日志是Binder类出现的,字面意思是数据过大。查看微信的SDK源码可以发现实际上调用微信API,微信会将图片传递给一个新的活动。
而Intent传值有大小限制,最大只能512KB!
现在错误原因知道了,微信分享图片会涉及到启动一个新活动,而新活动涉及到Intent传值,而Intent传值有大小限制,于是就会出问题。
可是如何解决呢?
既然直接传图片的Bitmap太大,那就把图片先保存在本地,然后直接传递图片的地址。
解决过程:
分享图片:
public void WXsharePic(String transaction, final boolean isSession, Bitmap bitmap, String path) {
//初始化WXImageObject和WXMediaMessage对象
WXImageObject imageObject;
if (!StringUtil.isBlank(path)) {
imageObject = new WXImageObject();
imageObject.setImagePath(path);
} else {
imageObject = new WXImageObject(bitmap);
}
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imageObject;
//设置缩略图
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, true);
bitmap.recycle();
msg.thumbData = getBitmapByte(scaledBitmap);
//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = transaction + Long.toString(System.currentTimeMillis());
req.message = msg;
//表示发送给朋友圈 WXSceneTimeline 表示发送给朋友 WXSceneSession
req.scene = isSession ? SendMessageToWX.Req.WXSceneSession : SendMessageToWX.Req.WXSceneTimeline;
//调用api接口发送数据到微信
api.sendReq(req);
}
调用分享:
private void shareToMoment() {
final Bitmap sharePicture = getBitmapByView(svShare);
AndPermission.with(this)
.permission(Permission.WRITE_EXTERNAL_STORAGE)
.onGranted(new Action() {
@Override
public void onAction(List<String> permissions) {
String path = saveImageToGallery(sharePicture);
WXsharePic("he" + System.currentTimeMillis(), true, sharePicture, path);
}
})
.onDenied(new Action() {
@Override
public void onAction(@NonNull List<String> permissions) {
Log.e("Activity", "权限申请失败");
}
})
.start();
}
保存图片:
public String saveImageToGallery(Bitmap bmp) {
// 首先保存图片
String storePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "dearxy";
File appDir = new File(storePath);
if (!appDir.exists()) {
appDir.mkdir();
}
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(appDir, fileName);
try {
FileOutputStream fos = new FileOutputStream(file);
//通过io流的方式来压缩保存图片
bmp.compress(Bitmap.CompressFormat.JPEG, 60, fos);
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
return storePath + "/" + fileName;
}
反思:
- 遇到问题直接查看错误日志,找到问题的根源,不能想当然;
- 对于安卓基础的了解有待加强;
- 总算明白了为什么QQ分享需要请求存储权限;
- BAT现在是大家,对于他们的API需要熟悉了解。
大家如果有什么疑问或者建议可以通过评论或者邮件的方式联系我,欢迎大家的评论~
微信分享大图遇到的问题(Android)的更多相关文章
- Android微信分享功能实例+demo
Android微信分享功能实例 1 微信开放平台注册 2 获得appId,添加到程序中,并运行程序 3 使用应用签名apk生成签名,添加到微信开放平台应用签名,完成注册 4 测试分享功能. 有问题请留 ...
- android微信分享不出去?四步搞定!
现在做的项目中集成了友盟分享,产品要求集成微信.朋友圈.QQ.QQ空间.短信这几个分享平台.按照友盟的文档集成一切都很顺利,集成成功以后测试QQ.QQ空间.短信都没有问题,唯独微信和朋友圈一直分享不出 ...
- Android微信分享图片大于32k进行压缩
微信分享视频的时候,需要传一个图片数组,大小不能大于32k. 解决方案:使用Bitmap自带的compress方法解决了这个问题. 源码如下: <span style="font-si ...
- android微信分享要注意的地方
最近在做android端分享的功能,在微信开放平台查看了下官网上的开发文档,一步一步的按文档上的步骤来: 1.申请你的AppID 2.下载开发工具包 3.搭建开发环境,引入libammsdk.jar文 ...
- React Native微信分享 朋友圈分享 Android/iOS 通用
超详细React Native实现微信好友/朋友圈分享功能-Android/iOS双平台通用 2016/06/16 | React Native技术文章 | Sky丶清| 暂无评论 | 1 ...
- Android 微信分享图文资料
上个项目做Android的微信分享,需要分享的内容有图片有文字,看了微信分享的SDK,貌似没有这个API,在网上搜了好久,总算找到解决方法了,直接上代码: public void sendReq(Co ...
- Android应用加入微信分享
一.申请你的AppID http://open.weixin.qq.com/ 友情提示:推荐使用eclipse打包软件最后一步的MD5值去申请AppID 二.官网下载libammsdk.jar包 ht ...
- [转] Android:微信授权登录与微信分享全解析
https://wohugb.gitbooks.io/wechat/content/qrconnent/refresh_token.html http://blog.csdn.net/xiong_it ...
- React Native之微信分享(iOS Android)
React Native之微信分享(iOS Android) 在使用React Native开发项目的时候,基本都会使用到微信好友或者微信朋友圈分享功能吧,那么今天我就带大家实现以下RN微信好友以及朋 ...
随机推荐
- javascript-发布订阅模式与观察者模式
设计模式"(Design Pattern)是针对编程中经常出现的.具有共性的问题,所提出的解决方法.著名的<设计模式>一书一共提出了23种模式. 发布订阅模式 它定义了一种对象间 ...
- 【纯技术贴】.NETStandard FreeSql v0.0.9 功能预览
年关将至,首页技术含量文章真是越来越少,理解大家盼着放假过年,哥们我何尝不是,先给大家拜个早年. 兄弟我从11月底发了神经,开启了 ORM 功能库的开发之旅,历时两个月编码和文档整理,目前预览版本更新 ...
- 华为模拟器eNSP安装(最新)网络工程师必备!
电脑杂七杂八的东西太多了,于是今天把电脑重装系统了,正好重新安装一下华为模拟器eNSP,这个教程应该是最新的,因为eNSP版本更新以及华为官网页面的变化,有的小伙伴安装eNSP都下载不到安装包,接下来 ...
- 历经15个小时,终于评出这8本最受欢迎的SQL书籍
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 程序员书库(ID:OpenSourceTop) 原文链接 | https://www.lif ...
- 2018-09-15 Java源码英翻中库以及服务原型
服务很简单, 只为演示这个库, 源码在: program-in-chinese/code_translator_service. 在Postman测试效果: 演示服务地址: 74.91.17.250: ...
- ArcGIS API For Javascript_4.8-渲染器Renderer
渲染器:Renderer 类:esri / renderers / Renderer 继承: Renderer->Accessor 子类: ClassBreaksRenderer , Heatm ...
- 自定义Json解析工具
此博客为博主原创文章,转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10689536.html fastjson是很好用的json解析工具,只可惜项目中要 ...
- 如何给Windows2016新建IIS并建立网站
首先在菜单按钮旁右击-----点击Control Panel(控制面板) 点击Turn Windows features on or off 开始设置环境!!!!! 认真勾选参数!!! 然后点击安装! ...
- qt+vs2017环境下XIMEA相机库的配置
从第一篇博客出来之后就没再更新过博客,这一次再更新博客的时候已经是换了项目了,现在在搞双目视觉方面.刚开始接触这一方面,前几天一直在研究相机原本的库函数的调用问题 网上这一方面的很少,而且很多都是在u ...
- 最简单的Nginx讲解--HTTP服务器、正向代理、反向代理、负载均衡
1. Nginx 1.1 Nginx简介 Nginx是俄罗斯人开发,开源的,免费的. Nginx功能: 1) nginx作为http服务器:类似apache,tomcat,遵循http协议. a) 访 ...