Android 某些手机将位图编码为字节[]数组时出现问题

Android 某些手机将位图编码为字节[]数组时出现问题,android,Android,我有一个从应用程序管理器加载的图标。它通常很小,通常为48x48。我保存此图标,稍后再加载 当我尝试加载保存的图标时,一些用户报告出现问题。不同用户的不同图标都会出现这种情况,唯一的共同点是他们的手机都运行Android 1.5(Sprint Hero、Sprint Moment、Droid Eris) 我可以很容易地看出,用户图标无法加载,因为您无法从48字节长的数组中创建有效的位图 我可以在创建字节数组的3行中更改什么来解决问题? 我也尝试过,但没有改变: compress(Compres

我有一个从应用程序管理器加载的图标。它通常很小,通常为48x48。我保存此图标,稍后再加载

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

我可以很容易地看出,用户图标无法加载,因为您无法从48字节长的数组中创建有效的位图

我可以在创建字节数组的3行中更改什么来解决问题? 我也尝试过,但没有改变:



compress(CompressFormat.PNG,100,out)

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

至于让它成功,我不知道这里是否有足够的信息来做到这一点。具体地说,我很好奇OutputStream的真实位置,因为我假设byteArrayOutputStream不是用于保存图标以供以后使用的实际流。由于它们在1.5设备上,我有一种预感,您正在尝试将此图标存储到缓存目录或位于手机存储器上的目录中。我的意思是,它可能从有故障的I/O设备到存储空间不足。我的直觉是,1.5设备上的物理设备空间不足,因为1.5设备上的大多数(并非所有)手机都没有太多的内部存储空间


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

我在Android 1.5上遇到过类似的问题,而Android 1.6、2.1和2.2运行良好

在我的例子中,bitmap.compress(bitmap.CompressFormat.PNG,100,outputstream)仅在使用BitmapFactory.decodeByteArray(…)从PNG图像创建的位图上失败。

这个问题的解决方法是在调用压缩(…)方法之前克隆这样的位图,如下面的代码所示

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);
}
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);
}