我试图让简单的decodeFile
正常工作,而我却在失去理智。
以下代码返回null
,而logcat则显示:D/skia﹕ --- decoder->decode returned false
Aldo有时会设法工作( mby 50次)。
try {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDither = true;
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
canvasBitmap = BitmapFactory.decodeFile(myFile.getAbsolutePath(), opt);
} catch (OutOfMemoryError e) {
Log.d(TAG, "Trace: " + e);
System.gc();
try {
Log.d(TAG, "Trying again");
canvasBitmap = BitmapFactory.decodeFile(myFile.getAbsolutePath());
} catch (OutOfMemoryError e2) {
Log.d(TAG, "Trace: " + e2);
Log.d(TAG, "Out of memory!!!!!!!");
}
}
文件已定义,getAbsolutePath返回/storage/emulated/0/Pictures/Screenshots/Screenshot_2015-07-28-16-18-56.png
文件基本上是在手机上截取的屏幕截图,它可以在图库应用程序和电脑上正常打开,因此它没有损坏。
如果出于某种原因,这项工作还没有用,是否有自己的解码器自定义库?我尝试了几个库,但它们似乎都使用相同的decodeFile。
我在nexus 4上进行测试,因此图像为760p。
答案 0 :(得分:0)
重试decodeFile()
毫无意义。因为如果没有足够的可用内存来构建Bitmap,decodeFile()
将返回null。您将不会收到任何其他警告,然后返回值为null。所以只需检查null; -
答案 1 :(得分:0)
我通过添加while
循环if else
以下代码:
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDither = true;
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
int i = 0;
while (canvasBitmap == null && ++i < 99) {
System.gc();
Log.d(TAG, "Trying again: " + i);
canvasBitmap = BitmapFactory.decodeFile(myFile.getAbsolutePath(), opt);
}
它看起来效率很低但是很有效,我也在主线程之外运行它,所以它不会导致任何不响应的行为。