安卓BitmapFactory.decodeStream()返回null的问题解决方法

简介:

今天遇到了一个问题,最终解决,记录下解决方案:

问题:从网络获取图片,数据为InputStream流对象,然后调用BitmapFactory的decodeStream()方法解码获取图片,返回null。

-------------------------------------------------

代码如下:

	private Bitmap getUrlBitmap(String url) {
		Bitmap bm;
		try {
			URL imageUrl = new URL(url);
			HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
			conn.connect();
			InputStream is = conn.getInputStream();
			// byte[] bt=getBytes(is); //注释部分换用另外一种方式解码
			// bm=BitmapFactory.decodeByteArray(bt,0,bt.length);
			bm = BitmapFactory.decodeStream(is); // 如果采用这种解码方式在低版本的API上会出现解码问题
			is.close();
			conn.disconnect();
			return bm;
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;

	}

结果在运行时编译器提示:          DEBUG/skia(xxx):--- decoder->decode returnedfalse 

已经确定从网络获取的数据流没有出现问题,而是在图片解码时出现错误。

经上网查阅资料得知,这个android 的一个bug 。在android 2.2 以下(包括2.2) 用 BitmapFactory.decodeStream() 这个方法,会出现概率性的解析失败的异常。而在高版本中,eg 2.3 则不会出现这种异常。

各种百度、各种谷歌、各种分析问题的过程就不再多说了,这里直接说一个解决方法,如下:

//定义一个根据图片url获取InputStream的方法
    public static byte[] getBytes(InputStream is) throws IOException {
        ByteArrayOutputStream outstream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024]; // 用数据装
        int len = -1;
        while ((len = is.read(buffer)) != -1) {
            outstream.write(buffer, 0, len);
        }
        outstream.close();
        // 关闭流一定要记得。
        return outstream.toByteArray();
    }

//然后使用方法decodeByteArray()方法解析编码,生成Bitmap对象。
    byte[] data = getBytesFromInputStream(new URL(imgUrl).openStream());
    Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);


当然可能还有其他更多的方法,这里只分享了一种,有问题大家共同讨论,互相分享。







目录
相关文章
|
存储 Linux 调度
【看表情包学Linux】系统下的文件操作 | 文件系统接口 | 系统调用与封装 | open,write,close 接口 | 系统传递标记位 O_RDWR,O_RDONLY,O_WRONLY...
【看表情包学Linux】系统下的文件操作 | 文件系统接口 | 系统调用与封装 | open,write,close 接口 | 系统传递标记位 O_RDWR,O_RDONLY,O_WRONLY...
612 1
|
10月前
|
弹性计算 Linux 网络安全
阿里云服务器购买流程详解:自定义、快速、活动、云市场镜像四种常见购买方式及适用场景详解
对于部分第一次购买阿里云服务器的用户来说,可能还不是很清楚阿里云服务器购买流程是怎样的,特别是选购过程中的一些注意事项。常见的购买方式有自定义购买、快速购买、通过活动购买、通过云市场镜像页面购买这四种购买方式,每种方式都有各自的适用场景和注意事项。本文将详细介绍这四种阿里云服务器购买方式的详细流程和适用场景,以供大家参考和选择最适合自己的方式。
597 5
|
API 开发者
在线CAD实现图纸比较功能
MXCAD提供了一项实用的图纸比对功能,帮助设计师高效识别不同版本CAD图纸间的改动。用户只需几个简单步骤即可启动比对过程:打开MXCAD在线示例,上传目标图纸,选择“图纸比对”并加载待比对文件。系统会清晰标出所有差异,甚至支持实体定位以便更直观地查看变化细节。此外,MXCAD还开放了相关API,允许开发者根据具体需求进行定制化二次开发,如利用`McObject.loadDwgBackground()`方法加载背景图纸并通过`MxCompare`类获取差异数据等。关注“梦想云图网页CAD”公众号了解更多资讯。
1121 134
在线CAD实现图纸比较功能
|
存储 图形学 开发者
Unity加载AB包
在 Unity 中加载 AssetBundle(AB 包)涉及文件定位、反序列化和内存管理。本地路径可通过 `Application.dataPath` 或 `Application.persistentDataPath` 获取,结合文件名定位 AB 包。远程 URL 则通过网络请求下载。代码示例展示了从本地和远程加载 AB 包的方法,使用 `UnityWebRequest` 和 `WWW` 类进行资源加载和实例化。
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
2252 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
缓存 编译器 API
聊一聊 C#中有趣的 SourceGenerator生成器
【10月更文挑战第1天】SourceGenerator 是 C# 中的一项强大功能,允许在编译时动态生成源代码,减少手动编写重复代码的工作量,并可在编译时进行优化和错误检查。它与 Roslyn 编译器紧密集成,可根据预定义逻辑生成新代码。应用场景包括自动生成接口实现和优化计算逻辑等。虽然能显著提升生产力和代码一致性,但开发和调试 SourceGenerator 本身较为复杂,维护成本较高。
849 8
|
运维 NoSQL 前端开发
介绍一下Redis的优缺点
【10月更文挑战第19天】介绍一下Redis的优缺点
|
设计模式 安全 图形学
Unity精华☀️ 面试官眼中的「设计模式」
Unity精华☀️ 面试官眼中的「设计模式」
|
存储 分布式计算 算法
探索Hadoop的三种运行模式:单机模式、伪分布式模式和完全分布式模式
在配置Hadoop集群之前,了解这三种模式的特点、适用场景和配置差异是非常重要的。这有助于用户根据个人需求和资源情况,选择最适合自己的Hadoop运行模式。在最初的学习和开发阶段,单机模式和伪分布式模式能为用户提供便利和成本效益。进而,当用户要处理大规模数据集时,完全分布式模式将是理想的选择。
1614 2

热门文章

最新文章