1. 程式人生 > >解決微信分享圖片,網址失效的Bug -- 不完美解決

解決微信分享圖片,網址失效的Bug -- 不完美解決

    先吐槽一句,微信SDK做的真TM的爛,主要是容錯能力太爛,出錯誤不提示,文件各種簡陋。

    我是在專案中用微信SDK分享帶圖片的連線,如下:

   

    發現有的連線可以正常分享有的卻不行,wechat_api.sendReq(req);返回false

    微信官方傻X文件是這樣描述的:

   

    然後我就表示很不理解了。

    後來在微信SDK網站亂逛的時候發現了這麼一條:

Q:為什麼使用微信SDK分享資訊給微信好友,有的訊息傳送成功,有的訊息傳送失敗(打不開微信)?(New)

A:這是因為SDK協議中對縮圖的大小作了限制,大小不能超過32K。另外限制的還有title、description等引數的大小。iOS開發者請在

微信開放平臺網站iOS手冊搜尋“thumbData”, Android開發者請見微信開放平臺網站Android手冊的“WXMediaMessage”頁面。

    好的,原因是我分享的縮圖超過了32k,那就壓縮吧。

==============

因為我用的是png的圖片,在stackoverflow上發現Bitmap的compress方法不支援PNG,只支援JPG。各種嘗試之後放棄了使用Bitmap的compress方法。

最後改用直接壓縮解析度,但是這樣不完美的地方在於我把超過32k的圖片全部改為99*99的,會丟掉部分細節。不知道有沒有人可以提供更完美的方式。

    public Bitmap createBitmapThumbnail(Bitmap bitMap) {
        int width = bitMap.getWidth();
        int height = bitMap.getHeight();
        // 設定想要的大小
        int newWidth = 99;
        int newHeight = 99;
        // 計算縮放比例
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // 取得想要縮放的matrix引數
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        // 得到新的圖片
        Bitmap newBitMap = Bitmap.createBitmap(bitMap, 0, 0, width, height,
                matrix, true);
        return newBitMap;
    }

=======另附上Android上圖片壓縮方式=======

第一:我們先看下質量壓縮方法:

  1. private Bitmap compressImage(Bitmap image) {  
  2.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  3.         image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//質量壓縮方法,這裡100表示不壓縮,把壓縮後的資料存放到baos中
  4.         int options = 100;  
  5.         while
     ( baos.toByteArray().length / 1024>100) {  //迴圈判斷如果壓縮後圖片是否大於100kb,大於繼續壓縮       
  6.             baos.reset();//重置baos即清空baos
  7.             image.compress(Bitmap.CompressFormat.JPEG, options, baos);//這裡壓縮options%,把壓縮後的資料存放到baos中
  8.             options -= 10;//每次都減少10
  9.         }  
  10.         ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把壓縮後的資料baos存放到ByteArrayInputStream中
  11.         Bitmap bitmap = BitmapFactory.decodeStream(isBm, nullnull);//把ByteArrayInputStream資料生成圖片
  12.         return bitmap;  
  13.     }  


第二:圖片按比例大小壓縮方法(根據路徑獲取圖片並壓縮):

  1. private Bitmap getimage(String srcPath) {  
  2.         BitmapFactory.Options newOpts = new BitmapFactory.Options();  
  3.         //開始讀入圖片,此時把options.inJustDecodeBounds 設回true了
  4.         newOpts.inJustDecodeBounds = true;  
  5.         Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此時返回bm為空
  6.         newOpts.inJustDecodeBounds = false;  
  7.         int w = newOpts.outWidth;  
  8.         int h = newOpts.outHeight;  
  9.         //現在主流手機比較多是800*480解析度,所以高和寬我們設定為
  10.         float hh = 800f;//這裡設定高度為800f
  11.         float ww = 480f;//這裡設定寬度為480f
  12.         //縮放比。由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可
  13.         int be = 1;//be=1表示不縮放
  14.         if (w > h && w > ww) {//如果寬度大的話根據寬度固定大小縮放
  15.             be = (int) (newOpts.outWidth / ww);  
  16.         } elseif (w < h && h > hh) {//如果高度高的話根據寬度固定大小縮放
  17.             be = (int) (newOpts.outHeight / hh);  
  18.         }  
  19.         if (be <= 0)  
  20.             be = 1;  
  21.         newOpts.inSampleSize = be;//設定縮放比例
  22.         //重新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了
  23.         bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  
  24.         return compressImage(bitmap);//壓縮好比例大小後再進行質量壓縮
  25.     }  


第三:圖片按比例大小壓縮方法(根據Bitmap圖片壓縮):

  1. private Bitmap comp(Bitmap image) {  
  2.     ByteArrayOutputStream baos = new ByteArrayOutputStream();         
  3.     image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  
  4.     if( baos.toByteArray().length / 1024>1024) {//判斷如果圖片大於1M,進行壓縮避免在生成圖片(BitmapFactory.decodeStream)時溢位  
  5.         baos.reset();//重置baos即清空baos
  6.         image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//這裡壓縮50%,把壓縮後的資料存放到baos中
  7.     }  
  8.     ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  
  9.     BitmapFactory.Options newOpts = new BitmapFactory.Options();  
  10.     //開始讀入圖片,此時把options.inJustDecodeBounds 設回true了
  11.     newOpts.inJustDecodeBounds = true;  
  12.     Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
  13.     newOpts.inJustDecodeBounds = false;  
  14.     int w = newOpts.outWidth;  
  15.     int h = newOpts.outHeight;  
  16.     //現在主流手機比較多是800*480解析度,所以高和寬我們設定為
  17.     float hh = 800f;//這裡設定高度為800f
  18.     float ww = 480f;//這裡設定寬度為480f
  19.     //縮放比。由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可
  20.     int be = 1;//be=1表示不縮放
  21.     if (w > h && w > ww) {//如果寬度大的話根據寬度固定大小縮放
  22.         be = (int) (newOpts.outWidth / ww);  
  23.     } elseif (w < h && h > hh) {//如果高度高的話根據寬度固定大小縮放
  24.         be = (int) (newOpts.outHeight / hh);  
  25.     }  
  26.     if (be <= 0)  
  27.         be = 1;  
  28.     newOpts.inSampleSize = be;//設定縮放比例
  29.     //重新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了
  30.     isBm = new ByteArrayInputStream(baos.toByteArray());  
  31.     bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
  32.     return compressImage(bitmap);//壓縮好比例大小後再進行質量壓縮
  33. }  

試一試:點選下載
 

相關推薦

解決分享圖片網址失效Bug -- 完美解決

    先吐槽一句,微信SDK做的真TM的爛,主要是容錯能力太爛,出錯誤不提示,文件各種簡陋。     我是在專案中用微信SDK分享帶圖片的連線,如下:         發現有的連線可以正常分享有的卻不行,wechat_api.sendReq(req);返回false  

分享功能手機分享圖片顯示

問題原因猜想:  a.圖片大小和尺寸太大出不來:圖片是150X150 的,近40K,後來給製作重新做圖,30X30的10k不到,分享圖片大小最好不要超過32k ,尺寸100x100以上就行,別太大了,太小了圖片失真  b.圖片路徑有{-}中劃線:某些瀏覽器或手機對含有中劃線的

分享功能安卓手機分享圖片顯示

最近公司做的一些專案都跟微信有關係,需要有個分享的功能,但是在測試環境的時候分享功能都正常,圖片標題描述之類的都沒問題,放到線上,安卓手機分享時,縮圖就是不顯示 介紹一下測試/生產環境:   測試環境:網站和圖片伺服器都是採用http   生產環境:網站和圖片伺服器都是採用https 問題原因猜想:

Android 分享圖片

static compress recycle 我們 text scale png _id string private String APP_ID = "00000000000000000"; //微信 APPID private IWXAPI iwxapi;

簡單設置分享圖片

auto nbsp keywords ctype div pat title gin doctype 設置微信分享企業網站時,微信縮略圖, 圖片: <!DOCTYPE html> <html> <head> <m

分享連結出現config:invalid signature錯誤的解決方法

當開發微信時需要做特定的頁面做分享時,根據官方提供的jssdk.php檔案建立的簽名資料包除錯時,大家碰到的最多的錯誤而且解決最麻煩的大概就是signature錯誤了,如下圖: 分享時提示錯誤“{"errMsg":"config:invalid signature"}” 一般出現這個錯

關於設定分享標題圖示

公眾號端: 1.你得有一個公眾號(訂閱號、服務號) 2.當前網站域名加進公眾號的js安全域名中(這一步必須,注意域名格式,已經將檔案放入指定位置,域名一般會繫結一個路徑到哪個資料夾,所以得將檔案放入對的位置,否則不能新增) 3.當前網站伺服器的ip加進公眾號的ip白名單中(這一步必須,在公眾號當中新增,

解決小程式使用wxcharts在螢幕固定問題-開發工具裡也顯示好了佈局為啥到真機就是亂的

解決微信小程式使用wxcharts在螢幕不固定問題-開發工具裡也顯示好了佈局,為啥到真機就是亂的 .chart{ width: 100%; text-align: center; } .canvas{ /* position: absolute; top: 10%; */ width: 100%; heig

react-native 解決分享支付 因簽名一致導致的分享失敗

當我們在做微信微博sdk分享的時候除錯非常麻煩,因為要使用對應的簽名版本才能呼叫sdk成功。 當我們使用AndroidStudio的Gradle之後會很簡單的解決這個問題。 1.我們把簽名檔案放到工程根目錄下(這樣做是為了保持路徑的統一) 2.在Gradle中引入如下程

ShareSDk分享簽名獲取及修改後生效的解決辦法

在微信開放平臺,獲取安卓應用簽名,有兩種方法,第一種是通過android studio命令列,命令如下:keytool -list -v -keystore H:\路徑\XXXXX.jks 重點:簽名是

網頁連結分享朋友圈帶圖示和摘要的完美解決方法

先看效果:    我不喜歡回形針。 以前我僅僅把網頁開始的地方放一個不可見的圖片,後來發現沒有效果。 現在我們開始: 原料:微信公眾號: 步驟一:繫結域名 先登入微信公眾平臺進入“公眾號設定”的“功能設定”裡填寫“JS介面安全域名”。 步驟

記一次錯誤:無法調起分享圖片

場景 由於專案需要,要在預覽圖片介面新增圖片分享功能,需要對純圖片進行分享,所以照舊呼叫了微信分享的封裝方法(WxShareUtil.of().open(true, bitmap);),第一個引數為是否分享到朋友圈,第二個引數為bitmap,因為預覽的圖片為u

javascript獲取wx.config內部欄位解決分享

轉自:http://www.jb51.net/article/80679.htm 背景 在微信分享開發的時候我們通常的流程是 <?php require_once "jssdk.php"; $jssdk = new

android為什麼我呼叫新浪分享圖片分享的是一張很模糊基本失真的圖片。。怎麼處理

程式碼如下,用這種方式調QQ,微信就不存在這麼嚴重的失真現象。  private String imageUrl = null;     private void weiboShare(){         if (!

Android友盟分享失敗一閃而過

BUG, 在這裡記錄一下這個奇葩問題,分享一下解決方案,真的無語了!!1.檢查程式碼,排除自身的程式碼問題。2.檢視安裝的釋出版APP的簽名,檢查這個簽名是否和微信開放平臺填寫的簽名一致。檢查包名是否填錯。3.檢查混淆打包時是否忽略了的加入友盟SDK的混淆程式碼。4.檢視列印的錯誤LOG,然後一直提示應用簽名

分享標題、內容、圖標顯示問題(時序問題)

origin nstat 顯示 圖標 ins 接口回調 打印 內容 window 今天在處理微信分享時,標題,內容、圖標不顯示問題,最後發現是時序問題。 只說思路,不上代碼, 我是在主頁,和詳情頁獲取的分享的參數(是一個對象,裏面含有title、shareUrl、conte

分享圖片和標題展示

步驟一:繫結域名 先登入微信公眾平臺進入“公眾號設定”的“功能設定”裡填寫“JS介面安全域名”。 備註:登入後可在“開發者中

利用WxJava實現網站整合登入功能核心程式碼竟然超過10行

最近網站PC端整合微信掃碼登入,踩了不少坑,在此記錄下實現過程和注意事項。 本文目錄 一、微信開放平臺操作步驟1.建立“網站應用”2.獲取AppID和AppSecret二、開發指南三、開發實戰1、pom.xml引入jar包2、配置檔案新增對應的配置3、初始化配置4、控制

分享無法指定標題、圖片、鏈接

() clas follow api 服務 ref 可能性 info 有效 1.打開wx.config裏的debug將debug設置為true之後,手機進入頁面,會彈出錯誤信息(PC不管有沒有配置正確都會在開發者工具中打印出對應的分享信息,參考意義不是很大——不過可以拿來查

Android 分享後點擊留在仍然跳到app的解決方法

今天碰到一個問題,同事在測試微信分享時,分享完了之後選擇留在微信,卻仍然跳回到了自己的app。在網上搜索時看到了這篇文章 https://blog.csdn.net/u010177022/article/details/80315499  ,看到其中有一段“當分享成功,點選“