android - 如何在 Android 11 中使用 NDK 从共享存储中打开文件
问题描述
访问共享存储 ( /storage/emulated/0
) 的权限变得非常复杂并且一直在变化。据我了解,在针对 Android 11 时,无法选择退出范围存储,这意味着您实际上永远无法做到fopen("/storage/emulated/0/foo.dat");
. 显然,打开文件的首选方法是使用 ,ACTION_OPEN_DOCUMENT
但这只是返回一个content://
URI,我无法使用 NDK 读取它。我也不确定您是否可以永远使用该 URI。
NDK 库如何用于访问/storage/emulated/0
Android 11 中的文件?
解决方案
啊哈,他们似乎已将读取/写入所有文件的权限移至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 的媒体扫描仪索引的文件。
推荐阅读
- typescript - Typescript:如何从返回函数的输入参数推断出高阶函数中的泛型类型
- android - NavHostFragment:使用导航抽屉重新打开更改的片段
- node.js - Node Express 在不重新加载的情况下验证表单提交但显示验证错误
- rust - 了解dbg!Rust 中的宏
- python - 我如何进行三个级别的继承(父亲,孩子,孙子)
- c - 有什么方法可以在我正在构建的内核中实现预制的 USBHID 驱动程序?
- java - 聚合通信的 DDD 和消息
- python - 在Python中将整行传递给numpy vectorize中的函数?
- android - Android查看setBackgroundColor()和夜间模式
- json - Cypress 拦截 API JSON 响应并提取 URL