[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();
    }
时间: 2024-09-28 22:38:11

[Android Pro] 关于BitmapFactory.decodeStream(is)方法无法正常解码为Bitmap对象的解决方法的相关文章

Android requires compiler compliance level 5.0 or 6.0. Found &#39;1.4&#39; instead.解决方法

今天在eclipse里报这个错误: Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead. Please fix project properties 1. 项目 右键 ->android tools ->Fix Project 2. 如果不可以,检查Project -> Properties->Java Compiler 确认JDK compliance被设置为1.6,并且enable

ajax回调函数中使用$(this)取不到对象的解决方法

如果在ajax的回调函数内使用$(this)的话,实践证明,是取不到任何对象的,需要的朋友可以参考下 $(".derek").each(function(){ $(this).click(function(){ var params = $(this).parent().serialize(); var obj=$(this).parent().siblings("div#caskContent"); var form=$(this).parent(); $.aja

Validation failed for one or more entities. See &lsquo;EntityValidationErrors&rsquo;解决方法;关于如何查看 EntityValidationErrors 详细信息的解决方法

我们在 EF 的编程中,有时候会遇到这样一个错误: 但是,按照他的提示 "See 'EntityValidationErrors' property for more details." 去 Exception 中查看,却只能看到 并不能看到具体的是那个属性为什么验证不通过,也许不少人都遇到这种情况. 这里给大家介绍一个Exception类,让我们能够轻松的知道具体的哪一个字段出了什么问题. 那就是 System.Data.Entity.Validation.DbEntityValid

Android中图片过大造成内存溢出,OOM(OutOfMemory)异常解决方法

当我们在做项目过程中,一遇到显示图片时,就要考虑图片的大小,所占内存的大小,原因就是Android分配给Bitmap的大小只有8M,试想想我们用手机拍照,普通的一张照片不也得1M以上,所以android处理图片时不得不考虑图片过大造成的内存异常. 那时候只是简单地缓存图片到本地 然后将图片进行压缩,但是感觉这个问题没有很好的解决办法,只是减小了发生的几率 这里,我将前辈们解决的方法重新整理一番,方便自己以后使用. 1.在内存引用上做些处理,常用的有软引用.强化引用.弱引用 import java

Android程序 依赖库引用Gson 报java.lang.NoClassDefFoundError: com/google/gson/Gson 解决方法

Android 程序所依赖一个Library程序B , B 程序中用到格式化json串,转换成标准json串的要求 public static String jsonFormatter(String uglyJSONString) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); JsonParser jp = new JsonParser(); JsonElement je = jp.parse(uglyJSONStri

〖Android〗从Android Studio转为Eclipse开发项目报E/StubController(23964): service = null 错误的解决方法

很久没有撸Android App开发了- 最近把一个月前通过反编译.二次修改的Android SSHD项目进行简单修改一下: 突然发现迁移项目时,报了一个错误: 04-29 20:20:11.493: W/dalvikvm(23964): threadid=1: thread exiting with uncaught exception (group=0x41b2cc50) 04-29 20:20:11.543: E/StubController(23964): service = null

Android Gradle编译so库或运行时出现 text relocations 崩溃的正确解决方法

1.so库编译时出现 这种情况一般是使用了新版的NDK编译造成的,新版的ndk将warning视为error, 解决方法: 在Android.mk里面加入#LOCAL_DISABLE_FATAL_LINKER_WARNINGS := true 这种方法编译的so库不能运行在target api为23以上的机器. 2.Android运行时崩溃提示 这种情况主要是因为从 API 23 开始,共享对象将不得包含文本重定位.也就是说,代码必须按原样加载,不得对其进行修改.这种方法减少了加载时间,并提高了

Android高版本联网失败报错:Cleartext HTTP traffic to xxx not permitted解决方法

前言:为保证用户数据和设备的安全,Google针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 Android P 系统的安卓设备无论是接收或者发送流量,未来都不能明码传输,需要使用下一代(Transport Layer Security)传输层安全协议,而 Android Nougat 和 Oreo 则不受影响. 因此在Android P 使用HttpUrlConnectio

Android 开发环境jdk配置 执行javac提示不是内部或外部命令解决方法

'JAVAC' 不是内部或外部命令,也不是可运行的程序 或批处理文件.问题解决方法分享! 'JAVA' 不是内部或外部命令,也不是可运行的程序 或批处理文件解决办法相似. 原因一:没有安装jdk,只安装了jre 1 jdk1.7.0_60+jre才是完整的,如果没有安装jdk的话,在cmd里边输入javac就会提示"'JAVAC' 不是内部或外部命令,也不是可运行的程序 或批处理文件" 步骤阅读 2 解决方法是安装jdk END 百度经验:jingyan.baidu.com 安装了JD