我有一个针对 SDK >= 33 的 Android 应用程序。目前它具有以下流程:
registerForActivityResult(ActivityResultContracts.GetContent()
和 URI audio/*
getExternalCacheDir
,以便我的 NDK 函数可以找到它getExternalFilesDir(Environment.DIRECTORY_MUSIC)
路径此时,我已准备好将输出文件列表作为处理结果返回给用户:
com.my.app Out file: /storage/emulated/0/Android/data/com.my.app/files/Music/processed_file_0.wav
com.my.app Out file: /storage/emulated/0/Android/data/com.my.app/files/Music/processed_file_1.wav
我真正想要的是启动Android内置文件浏览器到父目录
/storage/emulated/0/Android/data/com.my.app/files/Music/
,使用如下按钮:
<Browse processed outputs>
我的希望是有一个自然/内置的文件浏览器可以轻松地让用户做任何他们想做的事情,比如共享、保存、复制或打开/收听/播放文件 - 这些都不是我想要重新实现的功能- 在我的应用程序中实现给定的选择。
但是,我认为我的理解是有缺陷的,我们不允许用Intent系统做这样的事情。有什么好方法可以让用户对我的应用程序输出的音频文件做任何他们想做的事情,或者让他们浏览所述文件?
我尝试保存到媒体商店,它有效 - 我可以在
Audio/unknown/App Name/
中看到文件。然而,我再次找不到使用 EXTRA_INITIAL_URI
启动文件浏览器以指向此目录的方法。
我该怎么办?
使用 URI 音频/*
FWIW,
audio/*
是 MIME 类型,而不是 URI。
我的应用程序复制此文件
FWIW,不需要从
Uri
获得的 ActivityResultContracts.GetContent
来表示文件。
我真正想要的是启动Android内置文件浏览器到父目录/storage/emulated/0/Android/data/com.my.app/files/Music/,使用如下按钮:
抱歉,这不是一个选择。不存在完全相同且保证在所有约 30 亿 Android 设备上存在的“内置文件浏览器”。而且,在现代版本的 Android 上,任何此类文件浏览器都将无法访问您选择的位置。
让用户对我的应用程序输出的音频文件做任何他们想做的事情,或者让他们浏览所述文件,有什么好方法?
我首先让用户控制这些文档的创建位置。
使用您在临时步骤中创建的文件(因为您使用的是 NDK)。然后让用户通过
ActivityResultContracts.OpenDocumentTree
决定他们最终要去哪里,将文件复制到该树中的文档中。现在,内容位于用户控制的位置,他们可以使用他们想要的任何文件管理器或其他工具。