Android:decodeFile始终为内部存储中的文件返回null

时间:2011-05-16 03:57:44

标签: android bitmapfactory

我将文件本地保存到应用程序的私有存储中。我已经验证它存在,但每当我调用BitmapFactory.decodeFile时,它总是返回null。

如果我将文件保存为资源并使用ImageView setImageResource,它总是显示正常。

有什么问题?

以下是摘录:

filename = "test.png";

if (doesFileExist(filename))
    Bitmap bMap = BitmapFactory.decodeFile(filename);

我也试过了:

Bitmap bMap = BitmapFactory.decodeFile(getFilesDir().getPath()
                    + filename);

8 个答案:

答案 0 :(得分:30)

这个问题在此之前已得到解答: BitmapFactory.decodeFile returns null even image exists

这正是我所需要的:

String fname=new File(getFilesDir(), "test.png").getAbsolutePath();

答案 1 :(得分:3)

应该以特殊方式引用存储在应用程序资源中的文件。例如。如果文件位于资产中并命名为“myfile.png”,则必须将其引用为:

String uriString="file:///android_asset/myfile.png";
Uri uri=Uri.parse(uriString);

答案 2 :(得分:2)

尝试使用InputStream:

,而不是使用BitmapFactory.decodeFile
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    if(resultCode == RESULT_OK){          
        Uri selectedImage = imageReturnedIntent.getData();
        InputStream imageStream = getContentResolver().openInputStream(selectedImage);
        Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);

答案 3 :(得分:2)

BitmapFactory.decodeFile需要不带方案的文件路径。即开头没有file://

如果您正在处理Uri,则不仅要.toString(),还应在其上调用.getPath(),并将其传递给方法。

答案 4 :(得分:1)

添加所需权限后(READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE)

您需要将此行添加到清单中: android:requestLegacyExternalStorage="true"

enter image description here

答案 5 :(得分:0)

你能试试fileList()吗?它

  

返回一个命名的字符串数组   与此相关的私人文件   Context的应用程序包。

答案 6 :(得分:0)

对我来说,我从本地保存的URL获取图像,例如" file:///storage/emulated/0/...." (我使用Phonegap插件捕获图像。插件给了我图像路径,我需要在本机代码中使用)

以下是适用于我的代码段。

String captured_image_info = "file:///storage/emulated/0/Android/data/com.testapp/cache/1493809796526.jpg"
Uri uri=Uri.parse(captured_image_info);
largeLog("uri", "" + uri);

InputStream imageStream = getContentResolver().openInputStream(uri);

Bitmap bm = BitmapFactory.decodeStream(imageStream);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object

byte[] decodedBytes = baos.toByteArray();

Bitmap img_captured_image = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);

答案 7 :(得分:0)

您需要为Manifest.permission.READ_EXTERNAL_STORAGE设置运行时权限 如果不这样做,您将得到一个null,而不会在日志中得到任何错误消息甚至指示。 请注意,您需要在清单中和运行时都请求权限。