Android呼叫微信原生分享介面,進入微信分享介面返回不了!
阿新 • • 發佈:2019-02-18
今天測試員發現一個bug,分享停在微信介面,返回不了了,我擦!我就慢慢排除bug······首先圖片符合微信分享限制的大
public static final int THUMB_LENGTH_LIMIT = 32768;
(32K);後來我換一張本地圖片就成功發返回了,神奇了,我就仔細的尋找原因,是因為這張圖片導致的,如果圖片是jpeg格式的話就會出現這種返回不了的情況,是png的話就正常!這是個坑。
jpeg圖片如下:png圖片格式如下:
這是我呼叫微信原生分享的程式碼:
/**
* 分享網頁
* 直接呼叫微信原生sdk分享介面
* @param which 0:分享微信好友 1:分享微信朋友圈 2:分享微信收藏
* @param bitmaps 需要分享的原圖
* @param isNull 突圖片是否有效 true:表示圖片有效
*/
private void share(int which,Bitmap bitmaps ,Boolean isNull) {
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = url; //分享的url
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = title; //分享的標題string
msg.description = contents; //分享的內容string
//msg.thumbData = btye[] //分享的圖片url
if(isNull) {
msg.thumbData = BitmapUtil.zoomImage(bitmaps,100);//質量壓縮32K
}else {
//預設圖片
Bitmap bitmap_icon = BitmapFactory.decodeResource(getResources(),R.drawable.icon_share);
msg.thumbData = BitmapUtil.zoomImage(bitmap_icon,100);//質量壓縮32K
}
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = "webpage" + System.currentTimeMillis();
req.message = msg;
if (which == 0) {
req.scene = SendMessageToWX.Req.WXSceneSession;//傳送到好友介面
} else if (which == 1) {
req.scene = SendMessageToWX.Req.WXSceneTimeline;//傳送到朋友圈
} else if (which == 2) {
req.scene = SendMessageToWX.Req.WXSceneFavorite;//新增到微信收藏
}
IWXAPI api = WXAPIFactory.createWXAPI(MainActivity.this, Constants.APP_ID);
api.sendReq(req);
}
分享的圖片連結我是用Glide轉換成Bitmap再轉換成byte[]的
呼叫share方法的程式碼:
Glide.with(MainActivity.this).load(img).asBitmap().into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
share(which,resource,true);
}
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
share(which, null,false);
super.onLoadFailed(e, errorDrawable);
}
});
但是後臺配置的圖片缺少了http開頭,所以呼叫share(which, null,false);
這個方法就呼叫瞭解析本地圖片的資源,就碰到了jpeg圖片這個坑。
這個是我寫的遞迴壓縮圖片,小於微信要求的32K大小,仍有不足之處,如果每次質量壓縮都減10,減到0還是大於32K就不行了,有待優化。程式碼如下:
/***
* 分享微信 質量壓縮 寬高不變
* @param bgimage 源圖片資源
* @param quality 壓縮的質量
* @return byte[] 位元組陣列
*/
public static byte[] zoomImage(Bitmap bgimage, int quality) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bgimage.compress(Bitmap.CompressFormat.JPEG, quality, baos);//壓縮
byte[] bytes = baos.toByteArray();
//Log.e("--->wechat", "壓縮後,bytes.length=" + bytes.length + ",quality=" + quality);
if (baos.toByteArray().length >= WXMediaMessage.THUMB_LENGTH_LIMIT) {
bytes = zoomImage(bgimage, quality - 10);
}
return bytes;
}