• 关于BitmapFactory.decodeStream(is)方法无法正常解码为Bitmap对象的解决方法


    在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.  
      
    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,刚开始我怀疑是本身图片地址有问题,或图片自身格式不正确,但通过浏览器查看,图片显示正常,而且,我是保存了几十张图片,但每次都会有个别几张图片无法正常显示,需要重复下载三四次,才可能保存成功。

    后来在一篇文章中才发现,原来这是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();        
        }  
  • 相关阅读:
    用它,只需“拖拉拽”即可轻松创建APP和短信推送规则
    如何通过机智云接口生成设备对应的二维码
    新唐方案分享:基于NUC472开发板的物联网开发,接入机智云
    公告|苹果iOS13升级在即,机智云APP适配指南
    物联网中的数据透传
    多维数组
    pymysql库的学习
    selenium库的学习
    xpath语法和lxml库的学习
    MATLAB 机场价格数据预处理和分析
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5566146.html
Copyright © 2020-2023  润新知