最近在做微信分享的功能,圖片分享,小程序分享,由於圖片的原因,有的圖片總是分享不出去。於是對這塊進行了一些深入分析
分析過程
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。
總的來說,知道問題出現這裏了,只要夠小就一定能夠分享出去。但是在對圖片壓縮的時候,又遇到一些問題
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[] 的大小和這張圖片的大小、尺寸兩者有關係