BitmapFactory.decodeFile返回null并带有适当的文件

时间:2015-07-28 14:24:21

标签: android decode bitmapfactory

我试图让简单的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。

2 个答案:

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

它看起来效率很低但是很有效,我也在主线程之外运行它,所以它不会导致任何不响应的行为。