0

我使用以下方法来防止内存不足异常,但位图始终为空。有人有想法吗?

public Bitmap readBitmap(Android.Net.Uri selectedImage) {

        Bitmap bm = null;
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.InSampleSize = 9;
        AssetFileDescriptor fileDescriptor = null;
        try {
            fileDescriptor =  this.ContentResolver.OpenAssetFileDescriptor(selectedImage,"r");
        } catch (FileNotFoundException e) {
            Toast.MakeText(this, e.Message, ToastLength.Long);
        }
        finally{
            try {
                bm =  BitmapFactory.DecodeFileDescriptor(fileDescriptor.FileDescriptor, null, options);
                fileDescriptor.Close();
            } catch (IOException) {
            }
        }
        return bm;
}
4

4 回答 4

1

是的。这是谷歌的另一个错误。解决方案是这样做:

bm =  BitmapFactory.decodeStream(new FileInputStream(fileDescriptor));

代替

bm =  BitmapFactory.DecodeFileDescriptor(fileDescriptor.FileDescriptor, null, options);
于 2014-01-13T20:47:54.450 回答
0

也许 Uri 不正确并被FileNotFoundException抛出。但是您看不到这一点,因为您show()在 catch 子句中缺少 Toast 的方法。

应该是这样的:

 Toast.MakeText(this, e.Message, ToastLength.Long).show();
于 2013-01-07T10:12:10.567 回答
0

抓住机会,尝试像这样修改

} catch (IOException e) {
   Log.v ("Message", ""+e.message);
        }

所以你可以看到它返回 null 的错误是什么

于 2013-01-07T10:06:28.540 回答
0

BitmapFactory.DecodeFileDescriptor如果 bm 为空,则必须抛出异常。

于 2013-01-07T10:01:41.490 回答