轉自:http://blog.csdn.net/andypan1314/article/details/6670320
- Bitmap android.graphics.BitmapFactory.decodeStream(InputStream is)
- public static Bitmap decodeStream (InputStream is)
- Since: API Level 1
- Decode an input stream into a bitmap. <strong>If the input stream is null, or cannot be used to decode a bitmap, the function returns null</strong>. The stream's position will be where ever it was after the encoded data was read.
- Parameters
- is The input stream that holds the raw data to be decoded into a bitmap.
- Returns
- The decoded bitmap, or null if the image data could not be decoded.
注意黑體字。以下是具體代碼:
- public static Bitmap bmpFromURL(URL imageURL){
- Bitmap result = null;
- try {
- HttpURLConnection connection = (HttpURLConnection)imageURL .openConnection();
- connection.setDoInput(true);
- connection.connect();
- InputStream input = connection.getInputStream();
- result = BitmapFactory.decodeStream(input);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return result;
- }
所以在所獲得的InputStream不爲空的情況下,調用BitmapFactory.decodeStream(is)方法,他也有可能無法解碼成bitmap,剛開始我懷疑是本身圖片地址有問題,或圖片自身格式不正確,但通過瀏覽器查看,圖片顯示正常,而且,我是保存了幾十張圖片,但每次都會有個別幾張圖片無法正常顯示,需要重複下載三四次,纔可能保存成功。
後來在一篇文章中才發現,原來這是android 1.6版本的一個bug!
有牛人提出的一個解決辦法,我試了試,問題解決了
首先在原方法中改一句:
- result = BitmapFactory.decodeStream(new PatchInputStream(input));
再創建一個類:
- public class PatchInputStream extends FilterInputStream{
- protected PatchInputStream(InputStream in) {
- super(in);
- // TODO Auto-generated constructor stub
- }
- public long skip(long n)throws IOException{
- long m=0l;
- while(m<n){
- long _m=in.skip(n-m);
- if(_m==0l){
- break;
- }
- m+=_m;
- }
- return m;
- }
- }
第二種方法:最終用的是這種方法
- InputStream is = httpConn.getInputStream();
- if (is == null){
- throw new RuntimeException("stream is null");
- }else{
- try {
- byte[] data=readStream(is);
- if(data!=null){
- bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- is.close();
- }
- /*
- * 得到圖片字節流 數組大小
- * */
- public static byte[] readStream(InputStream inStream) throws Exception{
- ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int len = 0;
- while( (len=inStream.read(buffer)) != -1){
- outStream.write(buffer, 0, len);
- }
- outStream.close();
- inStream.close();
- return outStream.toByteArray();
- }