问题
App 中有一个分享图片到微信的功能,但是对于大图片就无法正常跳转到微信,查看 logcat 日志会如下问题:
原因分析
1、什么才算是大图?
经过验证,将图片压缩到 500kb 左右时可以分享成功。
2、微信有没有限制图片大小 查看微信文档:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Share_and_Favorites/Android.html
排除是微信限制图片大小的问题。
3、错误日志
“FAILED BINDER TRANSACTION”错误通常发生在进程间通信(IPC)时,特别是在Android系统中。Binder是Android IPC机制的一部分,允许不同的应用程序组件(如活动、服务、广播接收器等)以及系统服务之间进行通信。当尝试通过Binder发送的数据超过系统限制时,就会触发这个错误。 导致这个错误的主要原因包括:
数据大小限制:Binder有一个大小限制,通常是最多1MB。如果尝试通过Binder发送超过这个限制的数据,就会出现错误。
并发问题:在高并发场景下,如果有大量请求同时尝试通过Binder进行通信,可能会导致系统资源不足,从而触发错误。
内存限制:在某些情况下,即使发送的数据量没有超过Binder的限制,如果接收方没有足够的内存来处理这些数据,也可能导致错误。
原因基本就知道了:微信分享图片会使用 Intent 传值,而 Intent 传值有大小限制
解决办法
1、压缩图片
既然是图片数据大导致的,那就压缩就完了。
private static byte[] bitmapResizeGetBytes(Bitmap image, int size) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 质量压缩方法,这里100表示第一次不压缩,把压缩后的数据缓存到 baos
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int options = 100;
// 循环判断压缩后依然大于size 则继续压缩
while (baos.toByteArray().length / 1024 > size) {
// 重置baos即清空baos
baos.reset();
if (options > 10) {
options -= 8;
} else {
return bitmapResizeGetBytes(Bitmap.createScaledBitmap(image, 280, image.getHeight() / image.getWidth() * 280, true), size);
}
// 这里压缩options%,把压缩后的数据存放到baos中
image.compress