Android 11中文件操作遇到E/MediaProvider: insertFileIfNecessary failed 问题的解决方案
2024-02-03 17:26:18
避免Android 11中E/MediaProvider: insertFileIfNecessary failed java.lang.IllegalArgumentException: Pr错误的终极指南
在Android 11及更高版本中,您可能遇到过令人讨厌的错误:
E/MediaProvider: insertFileIfNecessary failed java.lang.IllegalArgumentException: Pr
这通常是由文件保存在不允许的目录中引起的。让我们潜入解决此问题的简单步骤,并避免它在未来再次发生。
为什么会出现此错误?
Android 11加强了对文件存储的控制,限制了应用程序访问某些目录。如果您尝试将文件保存在不在这些允许的目录中的位置,就会遇到这个错误。
解决错误的步骤
- 创建私有目录:
创建名为“my_images”的私有目录,以存储图像:
File myImagesDir = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "my_images");
myImagesDir.mkdirs();
- 保存临时文件:
将临时文件保存在“my_images”目录中:
File tempFile = new File(myImagesDir, "temp.jpg");
- 移动文件:
将文件从临时目录移动到“my_images”目录:
File myImageFile = new File(myImagesDir, "my_image.jpg");
tempFile.renameTo(myImageFile);
避免未来错误的提示
- 声明目录权限:
在您的应用程序清单文件中,声明您需要访问的目录,例如:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 使用Environment类:
使用Environment类访问允许的目录,例如:
File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
- 使用getExternalFilesDir():
使用Context类的getExternalFilesDir()方法访问应用程序的私有目录,例如:
File myImagesDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
常见问题解答
- 为什么我不能将文件保存到外部存储?
Android 11限制了应用程序对外部存储的访问,以增强安全性。
- 我还能在哪里保存文件?
您可以将文件保存在内部存储中,或在您的应用程序的私有目录中,如上所述。
- 我的应用程序需要哪些权限?
如果您要保存文件,您的应用程序需要WRITE_EXTERNAL_STORAGE权限。
- 如何检查我的应用程序是否具有所需的权限?
您可以使用Context类的checkSelfPermission()方法来检查权限。
- 我应该使用哪个目录来保存我的文件?
选择目录时,请考虑您对安全性、可用性和其他因素的要求。
结论
通过遵循这些步骤,您可以解决E/MediaProvider: insertFileIfNecessary failed java.lang.IllegalArgumentException: Pr错误,并避免它在Android 11及更高版本中再次出现。请记住要仔细考虑您保存文件的目录,并仅请求必要的权限。