最近在做微信分享的功能,图片分享,小程序分享,由于图片的原因,有的图片总是分享不出去。于是对这块进行了一些深入分析
分析过程
1、关于进程间通信
经过查看log日志,发现已经调用了微信的WXEntryActivity,并且我的App Activity 已经paused,但是没有跳到微信的分享界面,Activity 会马上resumed。
在log中看到这样的信息
2020-03-31 17:43:15.684 11722-11722/com.icisoo.xw D/MicroMsg.SDK.MMessageAct: send, targetPkgName = com.tencent.mm, targetClassName = com.tencent.mm.plugin.base.stub.WXEntryActivity
2020-03-31 17:43:15.687 11722-11722/com.icisoo.xw E/JavaBinder: !!! FAILED BINDER TRANSACTION !!! (parcel size = 1729212)
2020-03-31 17:43:15.687 11722-11722/com.icisoo.xw E/MicroMsg.SDK.MMessageAct: send fail, ex = Failure from system
那问题基本就清楚了,进程间通信的数据过大,根据官方文档介绍不能超过1M(1729212 超过1M了)。
在实际的测试中发现,parcel size = 543818 在华为,pixel2,是不能分享的,但是oppo手机是可以分享的。网上看到,有人猜测,国内rom限制是512k。
看过Binder源码的同学一定清楚,传输数据大小的限制,取决于mmap 映射的大小
总的来说,知道问题出现这里了,只要够小就一定能够分享出去。但是在对图片压缩的时候,又遇到一些问题
2、关于图片
测试发现有的图片分享不了。大小,尺寸都和其他的图片都一样,只有dpi不一样。
不能分享的图片水平/垂直分辨率是72dpi,其他是96 dpi。后来用PS把位深度改为96dpi( 每英寸上的像素点变多,所以分辨率就会变大),尺寸和其他图片一样,结果还是无法分享。
android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式:
图片长度 x 图片宽度 x 一个像素点占用的字节数
关于bitmap的介绍可以参考这篇文章
Bitmap压缩
只要对图片进行压缩,让他占用的内存小一点,就可以正常分享了,下面介绍几种bitmap压缩的方法,
1.质量压缩
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int quality = Integer.valueOf(editText.getText().toString());
bit.compress(CompressFormat.JPEG, quality, baos);
byte[] bytes = baos.toByteArray();
bm = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Log.i("wechat", "压缩后图片的大小" + (bm.getByteCount() / 1024 / 1024)
+ "M宽度为" + bm.getWidth() + "高度为" + bm.getHeight()
+ "bytes.length= " + (bytes.length / 1024) + "KB"
+ "quality=" + quality);
未完待续。。。
在Android中把bitmap 转为byte[] ,byte[] 的大小和这张图片的大小、尺寸两者有关系
参考:
JavaBinder: !!! FAILED BINDER TRANSACTION !!! 异常的解决方案分析
bitmap的六种压缩方式,Android图片压缩