.NET Avalonia Android应用仅能读取自身创建的文档文件问题
问题分析与解决方案:Avalonia .NET Android应用无法读取外部创建的Documents文件
核心原因是Android 10(API 29)及以上启用的分区存储(Scoped Storage)机制,这和你申请的传统存储权限、文件系统层面的权限没有直接关联,具体细节如下:
- 分区存储的沙箱限制:Android 10开始默认开启分区存储,APP仅能直接访问自身专属沙箱目录,以及通过媒体库访问媒体类文件(图片、音频、视频)。对于Documents目录下由USB复制、其他编辑器创建的非媒体文件(如文本文件),这类文件不属于你的APP沙箱关联内容,直接通过文件路径访问会被系统拦截,抛出
System.UnauthorizedAccessException。 - 传统存储权限的失效:在Android 11(API 30)及以上,
READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限仅对媒体文件生效,完全无法用于访问非媒体类的文档文件。你看到的文件系统权限、所有者一致,是Linux层面的属性,但Android应用权限是基于沙箱和系统权限模型的,二者不直接等价。 - 自身创建文件可访问的原因:你APP创建的文件会被系统标记为属于该APP的关联内容,因此可以直接通过路径访问,不受分区存储的严格限制。
可行解决方案
- 使用存储访问框架(SAF):这是Google推荐的标准方式。通过启动系统文件选择器(调用Android原生
ACTION_OPEN_DOCUMENTIntent),让用户手动选择要访问的文件,获取文件的Uri后,通过ContentResolver读取文件内容。这种方式不需要依赖传统存储权限,且适配所有Android 10+版本。 - 临时兼容方案(仅Android 10-12):在
AndroidManifest.xml的<application>标签中添加android:requestLegacyExternalStorage="true",强制关闭分区存储,这样可以继续通过文件路径访问所有外部文件。但该方案在Android 13及以上无效,且不符合Google的应用上架规范,仅适合临时测试或旧版本兼容。 - Android 13+媒体文件适配:如果需要访问媒体文件,可申请
READ_MEDIA_IMAGES、READ_MEDIA_VIDEO或READ_MEDIA_AUDIO权限,但非媒体类文档仍需使用SAF。
内容的提问来源于stack exchange,提问作者J23
相关产品推荐
相关产品推荐

