1. 程式人生 > >安卓BitmapFactory.decodeStream()返回null的問題解決方法

安卓BitmapFactory.decodeStream()返回null的問題解決方法

今天遇到了一個問題,最終解決,記錄下解決方案:

問題:從網路獲取圖片,資料為InputStream流物件,然後呼叫BitmapFactory的decodeStream()方法解碼獲取圖片,返回null。

-------------------------------------------------

程式碼如下:

  1. private Bitmap getUrlBitmap(String url) {  
  2.     Bitmap bm;  
  3.     try {  
  4.         URL imageUrl = new URL(url);  
  5.         HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();  
  6.         conn.connect();  
  7.         InputStream is = conn.getInputStream();  
  8.         // byte[] bt=getBytes(is); //註釋部分換用另外一種方式解碼
  9.         // bm=BitmapFactory.decodeByteArray(bt,0,bt.length);
  10.         bm = BitmapFactory.decodeStream(is); // 如果採用這種解碼方式在低版本的API上會出現解碼問題
  11.         is.close();  
  12.         conn.disconnect();  
  13.         return bm;  
  14.     } catch (MalformedURLException e) {  
  15.         e.printStackTrace();  
  16.     } catch (IOException e) {  
  17.         e.printStackTrace();  
  18.     }  
  19.     returnnull;  
  20. }  

結果在執行時編譯器提示:          DEBUG/skia(xxx):--- decoder->decode returnedfalse

已經確定從網路獲取的資料流沒有出現問題,而是在圖片解碼時出現錯誤。

經上網查閱資料得知,這個android 的一個bug 。在android 2.2 以下(包括2.2) 用 BitmapFactory.decodeStream() 這個方法,會出現概率性的解析失敗的異常。而在高版本中,eg 2.3 則不會出現這種異常。

各種百度、各種谷歌、各種分析問題的過程就不再多說了,這裡直接說一個解決方法,如下:

  1. //定義一個根據圖片url獲取InputStream的方法
  2.     publicstaticbyte[] getBytes(InputStream is) throws IOException {  
  3.         ByteArrayOutputStream outstream = new ByteArrayOutputStream();  
  4.         byte[] buffer = newbyte[1024]; // 用資料裝
  5.         int len = -1;  
  6.         while ((len = is.read(buffer)) != -1) {  
  7.             outstream.write(buffer, 0, len);  
  8.         }  
  9.         outstream.close();  
  10.         // 關閉流一定要記得。
  11.         return outstream.toByteArray();  
  12.     }  
  13. //然後使用方法decodeByteArray()方法解析編碼,生成Bitmap物件。
  14.     byte[] data = getBytesFromInputStream(new URL(imgUrl).openStream());  
  15.     Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);  

當然可能還有其他更多的方法,這裡只分享了一種,有問題大家共同討論,互相分享。

相關推薦

BitmapFactory.decodeStream()返回null的問題解決方法

今天遇到了一個問題,最終解決,記錄下解決方案: 問題:從網路獲取圖片,資料為InputStream流物件,然後呼叫BitmapFactory的decodeStream()方法解碼獲取圖片,返回null。 --------------------------------

Unity中關於多種外掛衝突問題的解決方法

     專案製作過程中,我們往往會引入一些SDK來實現Unity引擎本身無法實現的功能,在關於安卓這方面,我們都知道安卓包中都有一個叫AndroidManifest.xml的配置檔案,當我們引入2個或者多個安卓外掛後就會存在外掛之間的衝突問題,Unity會自動將它們合併成

【每天填坑一點點】(一)---為app寫介面 儘量不返回給前端null 解決方法

今天前端說,返回給前端太多的null,會導致app閃退。找的解決方案,作如下配置:我們專案用的是spring-boot。第一種:當返回前端null的時候,便不再返回該欄位(1)在bean上面加註解import com.fasterxml.jackson.annotation.

自定義View通過findviewbyid返回null解決方法

findviewbyid 返回為null,這個問題一般說明想要找的view沒有在對應的layout上面。 今天遇到一個同樣的問題,但是確定view已經在layout上,但是仍然返回為null。雖然最終找到了問題原因,但是過程艱辛。 具體程式碼如下 MainAct

BitmapFactory.decodeStream 返回值為null的問題

public void download(String u) throws Exception { URL url = new URL(u); HttpURLConnection conn = (HttpURLConnection) ur

優化應用內存的神奇方法以及背後的原理,一般人我不告訴他

hvr 通知 lib easy rgb ger eset canvas 統計 安卓應用一般都害怕自己被殺。內存占用高是被殺的重要原因之中的一個。所以大家都想盡各種招數應對,但效果都一般。 但有一招: WindowManagerGlobal.getInstance(

Mac運行React Native項目報錯解決

height png oid 百度一下 ati 解決 blank tin 介紹 傳送門參考: 下面的這個鏈接很詳細了,一步一步就好.... https://github.com/NARUTOyuyang/React-Native 然而在運行react-native run-

手機照片誤刪恢復方法步驟

照片誤刪恢復 針對一系列的數據恢復問題,小編在這裏了解一個有效的方法來解決手機裏的照片刪了恢復問題?這應該是大家都想知道的,不管大家是使用蘋果手機還是安卓手機,面對數據丟失的問題,這都是比較麻煩的。那麽手機裏的照片刪了怎麽恢復?我們就一起來了解安卓手機的誤刪恢復吧! 互盾照片恢

PHP 獲取JSON json_decode返回NULL解決辦法

單引號 .com 獲取json 原來 json數據 頁面 替換 解決辦法如下 對象 在用json_decode對JSON格式的字符串進行解碼時竟然為空,頁面空白啊,整半天檢查這裏檢查那裏,問同事都沒用。 今天必應搜索了下,問題解決了,原來是有BOM頭輸出,大蝦的解決辦法如下

php 反序列化返回false解決方法

反序 blog $2 序列化 nbsp post 序列 php replace function mb_unserialize($serial_str) { $serial_str= preg_replace(‘!s:(\d+):"(.*?)";

APP載入HTML5頁面解決方式總結

true ide 不同 webclient devtools 先來 介紹 未來 童鞋 因為H5頁面在移動端的兼容性及擴展性方面體現出來的優勢,又兼得APP中植入H5

【SpringBoot】攔截器使用@Autowired註入接口為null解決方法

res 自定義 row 攔截 request spa mvcc gist private 最近使用SpringBoot的自定義攔截器,在攔截器中註入了一個DAO,準備下面作相應操作,攔截器代碼: public class TokenInterceptor implemen

xamarin 輸出中文錯誤 亂碼解決

col png alt utf 信息 OS pan family 亂碼 在編譯設置附加參數 -J-Duser.language=en 這個錯誤信息是來自javac 編譯產生的 而中文亂碼問題是 GBK 和UTF8 的問題 解決的辦法就是讓j

Server Host Cannot be null解決方法

設置 錯誤 can 運行 一個 server 新的 問題 service 在用打開Services Directory application 或者訪問 某個已發布的地圖服務時,出現"Server Host Cannot be null"的錯誤。 問題的原因在於

圖片壓縮處理的終極方法,適用於各種機型

//直接呼叫getimage,引數為:路徑、寬、高 public static Bitmap getimage(String pathName, int reqWidth, int reqHeight) { final BitmapFactory.Options option

開發中傳送簡訊的方法 APP內單發簡訊 群發簡訊 APP跳轉到簡訊頁 單條簡訊 多條簡訊Intent跳轉

1.APP內部直接傳送短息 包括髮送單條簡訊 傳送多條簡訊 APP內部發送簡訊首先要獲取一個傳送簡訊的許可權 <uses-permission android:name="android.permission.SEND_SMS"/> 安卓6.0以上的手機要動態獲取到這個許可

上文字垂直居中解決方案

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1

vue裡監聽的物理返回

Hybrid App中,原生內嵌H5單頁,按安卓物理返回鍵的時候會返回到上一個路由, 實際中需求是:當有彈層的時候,按物理返回鍵是關閉彈層,是頁面的時候才執行返回上一個路由, 開始的方案是Android原生重寫方法onKeyDown(),H5 JsBridge js去呼叫方法,當需要的時候遮蔽物理返回鍵,

Cocos Creator 監聽螢幕下方返回

addEscEvent = function(node){ cc.eventManager.addListener({ event: cc.EventListener.KEYBOARD, onKeyPressed: function(keyCode, event){

新增背景圖片時解決圖片拉伸問題

問題描述: 當我們在android layout佈局檔案設定背景圖片只需要加上 android:background="@drawable/ic_bg"  就可以了設定ic_bg為背景的圖片了 然而這樣設定後當圖片較小時會發現 圖片被拉伸了,失真。     解決方法