zoukankan      html  css  js  c++  java
  • [Android Pro] 关于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();      
        }
  • 相关阅读:
    深度学习丨Deep Learning学习资源整理
    机器学习丨《机器学习》、《统计学习方法》思维导图
    概率统计丨陈希孺《概率论与数理统计》思维导图
    数据科学丨DataScience工具速查卡
    线性代数丨《线性代数及其应用》思维导图
    Api接口加密策略
    tomcat重启警告:Abandoned connection cleanup thread 服务器宕机解决方案
    spring mvc多环境下配置文件的设置
    mysql中将查询结果进行拼接处理及concat、group_concat的使用
    JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置
  • 原文地址:https://www.cnblogs.com/0616--ataozhijia/p/3946659.html
Copyright © 2011-2022 走看看