根据 Android R 中授予的文档文件路径访问权限:
从 Android 11 开始,具有 READ_EXTERNAL_STORAGE 权限的应用可以使用直接文件路径和本机库读取设备的媒体文件。这项新功能使您的应用程序可以更顺畅地与第三方媒体库配合使用。
问题是我无法从 MediaStore
获取文件路径,那么我们应该如何读取我们无法访问/检索的文件路径?有没有办法,我不知道,我们可以从 MediaStore
获取文件路径?
此外, 文档说以下内容:
所有文件访问
某些应用程序的核心用例需要广泛的文件访问权限,例如文件管理或备份和恢复操作。他们可以通过执行以下操作获得所有文件访问权限:
- 声明 MANAGE_EXTERNAL_STORAGE 权限。
- 将用户引导至系统设置页面,他们可以在其中为您的应用启用允许访问以管理所有文件选项。
此权限授予以下内容:
- 对共享存储中所有文件的读取访问和写入访问。
- 访问 MediaStore.Files 表的内容。
但我不需要所有文件访问权限,我只希望用户从 MediaStore
中选择一个视频并将文件路径传递给 FFmpeg
(它需要一个文件路径)。我知道我不能再使用 _data
列来检索文件路径。
请注意:
- 我知道
Uri
从MediaStore
返回并且不指向文件。 - 我知道我可以将文件复制到我的应用程序目录并将其传递给
FFmpeg
,但我可以在 Android R 之前做到这一点。 - I can not pass
FileDescriptor
toFFmpeg
and I can not use/proc/self/fd/
(I get/proc/7828/fd/70: Permission denied
when selecting a file from the SD Card) ,看看 这个问题。
那我该怎么办,我错过了什么吗? can read a device's media files using direct file paths and native libraries
是什么意思?
原文由 HB. 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 issuetracker 上问了一个问题之后,我得出以下结论:
File
限制。所以我们可以再次访问File
对象。这是为了确保文件路径在 Android 10(Q) 上正常工作。在 Android R 上,此属性将被忽略。
DISPLAY_NAME
和RELATIVE_PATH
,这里是一个例子:You can no longer use the
ACTION_OPEN_DOCUMENT_TREE
or theACTION_OPEN_DOCUMENT
intent action to request that the user select individual files fromAndroid/data/
,Android/obb/
and all子目录。建议仅在需要执行“查找”时使用
FFmpeg
File
,例如使用 --- 时。您只能使用数据列来访问磁盘上的文件。您应该相应地处理 I/O 异常。
如果你想访问
File
或想要来自Uri
的文件路径,它是从MediaStore
返回的, 我已经创建了所有处理异常的库--- ,你可能会得到。这包括磁盘、内部和可移动磁盘上的所有文件。例如,当从 Dropbox 选择File
时,File
将被复制到您具有完全访问权限的应用程序目录,然后将返回复制的文件路径。