首页 > 解决方案 > 如何在 Android 11 中使用 NDK 从共享存储中打开文件

问题描述

访问共享存储 ( /storage/emulated/0) 的权限变得非常复杂并且一直在变化。据我了解,在针对 Android 11 时,无法选择退出范围存储,这意味着您实际上永远无法做到fopen("/storage/emulated/0/foo.dat");. 显然,打开文件的首选方法是使用 ,ACTION_OPEN_DOCUMENT但这只是返回一个content://URI,我无法使用 NDK 读取它。我也不确定您是否可以永远使用该 URI。

NDK 库如何用于访问/storage/emulated/0Android 11 中的文件?

标签: androidandroid-ndk

解决方案


啊哈,他们似乎已将读取/写入所有文件的权限移至MANAGE_EXTERNAL_STORAGE. 这是用户必须在设置中授予的权限之一,并且有一个意图 ( ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) 将人们直接带到那里。

但是,除非它是文件管理器或类似的应用程序,否则他们可能不会让您将具有此权限的应用程序上传到 Play 商店,而您目前根本无法使用它。

如果您的应用包含类似于以下示例的用例,则可能允许请求MANAGE_EXTERNAL_STORAGE权限:

  • 文件管理器
  • 备份还原
  • 防病毒应用程序
  • 文档管理应用

出于与 COVID-19 相关的考虑,面向 Android 11(API 级别 30)或更高版本且需要MANAGE_EXTERNAL_STORAGE许可的应用要到 2021 年初才能上传到 Google Play。

我还应该注意,仅打开媒体文件似乎有一个例外- 即由 Android 的媒体扫描仪索引的文件。


推荐阅读