在某些手机上,将位图编码为字节数组时出现问题。

4

我有一个从应用管理器加载的图标。它通常很小,通常是48x48像素。我保存这个图标并稍后重新加载。

一些用户报告说当我尝试加载保存的图标时出现问题。这对于不同用户的不同图标都会发生,唯一的共同点是他们都使用运行Android 1.5(Sprint Hero、Sprint Moment、Droid Eris)的手机。

//Returns a valid drawable 100% of the time
Drawable drawable = activityInfo.loadIcon(manager);

//Creates a bitmap 100% of the time
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();

//This drawable can always be displayed (so you know the bitmap is good here.
Drawable testDrawable = new BitmapDrawable(bitmap);

//There are no errors thrown from these lines but in ALL cases if it fails the length of the byte[] array b is 48. 
//When it succeeds the length is much bigger 1000+.
ByteArrayOutputStream out= new ByteArrayOutputStream(); 
bitmap.compress(CompressFormat.PNG, 0, out);
byte[] b = out.toByteArray();

我可以轻松地告诉你,用户图标无法加载,因为从48长度的字节数组中无法创建有效的位图。您能否在创建字节数组的三行代码中进行更改以解决问题?我也尝试过,但没有变化: bitmap.compress(CompressFormat.PNG, 100, out);
2个回答

2

我在Android 1.5上遇到了类似的问题,而在Android 1.6、2.1和2.2上却没有问题。

在我的情况下,bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputstream)仅在使用BitmapFactory.decodeByteArray(...)创建的PNG图像位图上失败。

解决这个问题的方法/解决方案是在调用其compress(...)方法之前克隆这样的位图,如下面的代码所示:

boolean success = bitmap.compress(CompressFormat.PNG, 100, outputStream);
if (! success) {
   Bitmap cloneImg = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), false); 
   outputStream = new ByteArrayOutputStream();
   cloneImg.compress(CompressFormat.PNG, 100, outputStream);
}

0

您还可以测试compress()返回的布尔值,以确定压缩是否成功。

至于如何使其成功,我不知道这里是否有足够的信息来做到这一点。具体而言,我很好奇OutputStream的真实位置,因为我认为byteArrayOutputStream并不是用于保存图标以供以后使用的实际流。由于它们在1.5设备上,我猜测您正在尝试将此图标存储到缓存目录或位于手机存储上的目录中。这可能是从故障的I/O设备到存储空间不足的范围。从1.5设备上发生的情况来看,我的直觉是物理设备上没有足够的空间,因为大多数(不是全部)1.5手机都没有太多的内部存储空间。

此外,我认为更改PNG格式的压缩质量并不重要,因为PNG是无损的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接