android – 将位图编码为byte []数组时某些手机出现问题

我有一个从应用管理器加载的图标.它通常很小,通常为48×48.我保存此图标并稍后将其加载.

当我尝试加载保存的图标时,有些用户报告了问题.这适用于不同用户的不同图标,唯一的共同点是他们都拥有运行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长度字节数组中创建有效的位图.

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

bitmap.compress(CompressFormat.PNG,100,out);

最佳答案 我在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);
}
点赞