我有一个从应用管理器加载的图标.它通常很小,通常为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);
}