在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. If the input stream is null, or cannot be used to decode a bitmap, the function returns null. 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; }
后来调试发现,result为null,加之查看帮助文档中的黑体字,
所以在所获得的InputStream不为空的情况下,调用BitmapFactory.decodeStream(is)方法,他也有可能无法解码成bitmap,刚开始我怀疑是本身图片地址有问题,或图片自身格式不正确,但通过浏览器查看,图片显示正常,而且,我是保存了几十张图片,但每次都会有个别几张图片无法正常显示,需要重复下载三四次,才可能保存成功。后来在一篇文章中才发现,原来这是 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
第二种方法:最终用的是这种方法
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(); }