Android 存储分区 - chuwuwang/ReadingNote GitHub Wiki

W/System.err: Caused by: android.system.ErrnoException: open failed: EPERM (Operation not permitted)
W/System.err:     at libcore.io.Linux.open(Native Method)
W/System.err:     at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
W/System.err:     at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
W/System.err:     at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7360)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:481)
W/System.err:   ... 17 more

从 Android Q(10.0) sdk >= 29 开始,系统为每个 app 提供了一个隔离环境(分区存储),参考下列资料,有十分详细的说明,这里给出解决办法。

参考资料:

开发者文档 https://developer.android.google.cn/training/data-storage/files/external-scoped?hl=zh_cn

解决办法

① 在 AndroidManifest.xml 中加入 android:requestLegacyExternalStorage=“true”

加入这句代码之后会启动兼容模式:停用分区存储,但是要留意的是。

警告:2020 年,主要平台版本将要求所有应用都使用分区存储,无论应用的目标 SDK 级别是多少。因此,您应该提前确保您的应用能够使用分区存储。为此,请确保针对搭载 Android 10(API 级别 29)及更高版本的设备启用了该行为。

在您的应用完全兼容分区存储之前,您可以根据应用的目标 SDK 级别或 requestLegacyExternalStorage 清单属性,暂时选择停用分区存储。

以 Android 9(API 级别 28)或更低版本为目标平台。如果以 Android 10 或更高版本为目标平台,请在应用的清单文件中将 requestLegacyExternalStorage 的值设为 true。

② 访问媒体文件,使用 MediaStore。

③ 访问其他应用创建的任何其他文件,使用系统提供的存储访问框架。

https://zhuanlan.zhihu.com/p/66107778

https://ld246.com/article/1586400329644