最近在做微信分享的功能,图片分享,小程序分享,由于图片的原因,有的图片总是分享不出去。于是对这块进行了一些深入分析

分析过程

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图片压缩