返回

Android 11中文件操作遇到E/MediaProvider: insertFileIfNecessary failed 问题的解决方案

Android

避免Android 11中E/MediaProvider: insertFileIfNecessary failed java.lang.IllegalArgumentException: Pr错误的终极指南

在Android 11及更高版本中,您可能遇到过令人讨厌的错误:

E/MediaProvider: insertFileIfNecessary failed java.lang.IllegalArgumentException: Pr

这通常是由文件保存在不允许的目录中引起的。让我们潜入解决此问题的简单步骤,并避免它在未来再次发生。

为什么会出现此错误?

Android 11加强了对文件存储的控制,限制了应用程序访问某些目录。如果您尝试将文件保存在不在这些允许的目录中的位置,就会遇到这个错误。

解决错误的步骤

  1. 创建私有目录:

创建名为“my_images”的私有目录,以存储图像:

File myImagesDir = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "my_images");
myImagesDir.mkdirs();
  1. 保存临时文件:

将临时文件保存在“my_images”目录中:

File tempFile = new File(myImagesDir, "temp.jpg");
  1. 移动文件:

将文件从临时目录移动到“my_images”目录:

File myImageFile = new File(myImagesDir, "my_image.jpg");
tempFile.renameTo(myImageFile);

避免未来错误的提示

  1. 声明目录权限:

在您的应用程序清单文件中,声明您需要访问的目录,例如:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  1. 使用Environment类:

使用Environment类访问允许的目录,例如:

File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
  1. 使用getExternalFilesDir():

使用Context类的getExternalFilesDir()方法访问应用程序的私有目录,例如:

File myImagesDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);

常见问题解答

  1. 为什么我不能将文件保存到外部存储?

Android 11限制了应用程序对外部存储的访问,以增强安全性。

  1. 我还能在哪里保存文件?

您可以将文件保存在内部存储中,或在您的应用程序的私有目录中,如上所述。

  1. 我的应用程序需要哪些权限?

如果您要保存文件,您的应用程序需要WRITE_EXTERNAL_STORAGE权限。

  1. 如何检查我的应用程序是否具有所需的权限?

您可以使用Context类的checkSelfPermission()方法来检查权限。

  1. 我应该使用哪个目录来保存我的文件?

选择目录时,请考虑您对安全性、可用性和其他因素的要求。

结论

通过遵循这些步骤,您可以解决E/MediaProvider: insertFileIfNecessary failed java.lang.IllegalArgumentException: Pr错误,并避免它在Android 11及更高版本中再次出现。请记住要仔细考虑您保存文件的目录,并仅请求必要的权限。