1. 程式人生 > >Android呼叫微信原生分享介面,進入微信分享介面返回不了!

Android呼叫微信原生分享介面,進入微信分享介面返回不了!

今天測試員發現一個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;
    }