1.除了没有授予读写权限
2.除了文件路劲异常
java.io.FileNotFoundException:
/storage/emulated/0/Image/1684917871626.png: open failed: EPERM
(Operation not permitted)
android 10(Q)开始增加了沙盒机制,不能直接把文件保存到/sdcard目录下,只能保存到APP专属目录下;AndroidManifest.xml在标签下增加属性【android:requestLegacyExternalStorage=“true”】可以暂时保存到/sdcard路径下
但是在目标版本在Android 11及以上 在/sdcard下的读写就不生效了 , 报
open failed: EPERM
(Operation not permitted) 错误
追寻原因
发现在 Android 11中 File.mkdirs() 一直是false,就连文件夹都创建不了 更别提文件操作。
最后查找到原因
: 由于Android 11范围的存储被强制执行。针对Android 10(API级别29)的应用程序仍然可以请求requestLegacyExternalStorage属性。此标志允许应用程序暂时退出与作用域存储相关的更改,例如授予对不同目录和不同类型媒体文件的访问权限。将应用程序更新为目标Android 11后,系统将忽略requestLegacyExternalStorage标志。
在 API 级别 29 中,不推荐直接访问共享/外部存储设备。当应用定位到Build.VERSION_CODES时。Q,从getExternalStorageDirectory()方法返回的路径不再可直接被应用程序访问。应用可以通过迁移到 Context#getExternalFilesDir(String)、MediaStore 或 Intent#ACTION_OPEN_DOCUMENT 等替代项来继续访问存储在共享/外部存储上的内容。
最终的解决方案
:在 API 级别 30 Android11 及以上 不要在 /sdcard 外部路劲下存储资源 ,使用内部存储路劲操作资源。
private String getSavePath() {
String path;
if (Build.VERSION.SDK_INT > 29) {
path = mContext.getExternalFilesDir(null).getAbsolutePath() + "/app/audio/";
} else {
path = Environment.getExternalStorageDirectory().getPath() + "/app/audio/";
return path;
这样就可以在不报错的情况下 做文件存储,
但是高版本保存图片.视频 在内部存储下 没法直接共享于手机相册中————
在 API 级别 29 中,不推荐直接访问共享/外部存储设备。此标志允许应用程序暂时退出与作用域存储相关的更改,例如授予对不同目录和不同类型媒体文件的访问权限。android 10(Q)开始增加了沙盒机制,不能直接把文件保存到/sdcard目录下,只能保存到APP专属目录下;:在 API 级别 30 Android11 及以上 不要在 /sdcard 外部路劲下存储资源 ,使用内部存储路劲操作资源。但是在目标版本在Android 11及以上 在/sdcard下的读写就不生效了 , 报。
记一次大量文件中出现限定字符“|”的解决方案
某一天,我将手机(安卓11)接入电脑,开启文件传输功能,想要在电脑上整理文件,这样会比手机快得多,但我在移动某些文件的时候,发现完全无效,甚至没反应,然后我又用手机进行同样的操作,结果就出现"open failed:EPERM(Operation not permitted)",查了好一会没结果,网上说的都不是一个事。
二、解决历程
(一)问题定位
经过一段时间的摸索,我发现,有些文件是能够正常移动和定位的,相比之下,文件名好像是有差异的,仔细一看,
尝试解决:
原本保存路径:Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) .getPath() + File.separator + SAVE_Folder;
看了资料后修改的路径:ContextCompat.getExternalFilesDirs(.
open failed: EPERM (Operation not permitted)错误是由于Android 10及更高版本引入了沙盒机制所导致的。这意味着应用程序不能直接访问/sdcard目录下的文件,而是只能保存到应用程序专属的目录下。在AndroidManifest.xml文件中,可以通过在<application>标签下添加属性【android:requestLegacyExternalStorage="true"】来暂时允许应用程序访问/sdcard路径下的文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [FileNotFoundException xxxxxxxxxx open failed: EPERM (Operation not permitted)](https://blog.csdn.net/weixin_44669831/article/details/130850804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]