在android sdk 1.6版本API帮助文档中,其中关于BitmapFactory.decodeFactory.decodeStream(InputStream is)的帮助文档是这么说明的:

 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.Parametersis  The input stream that holds the raw data to be decoded into a bitmap. ReturnsThe 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;}

后来调试发现,result为null,加之查看帮助文档中的黑体字,
所以在所获得的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();          }

更多相关文章

  1. android客户端版本检测更新,服务下载,通知栏显示
  2. Android:不同drawable文件夹的区别
  3. android 之 新浪微博
  4. android 简单比较 两个图片是否一致
  5. Android(安卓)图片加载工具类 Universal-Image-Loader 的封装和
  6. ubuntu 11.10 android ndk awk安装错误修改记
  7. How to compile Android(安卓)2.3 on Ubuntu 10.04 32bit
  8. android 调用系统照相机拍照后保存到系统相册,在系统图库中能看到
  9. android studio 2.0 引导页示例

随机推荐

  1. Dojo Mobile:iPhone/Android的Web应用开发
  2. Android(安卓)蓝牙调色灯/zigbee调色灯学
  3. Android下基于XML的 Graphics
  4. Android的init过程详解(一)
  5. Android: NDK编程入门笔记
  6. android 线程,服务,活动
  7. Android(安卓)UI学习1:控件和基本事件的
  8. Android的多媒体框架OpenCore(PacketVideo
  9. AndroidTouch事件的传递、拦截、消费分析
  10. Android开发入门之路(初学者必读)