如何使用ActivityResultLauncher设置文件选择器的初始URI
解决文件选择器指定初始目录的问题
你当前使用的ActivityResultContracts.GetContent()无法支持设置初始目录,要实现这个需求,需要替换为直接构建ACTION_OPEN_DOCUMENT的Intent,并通过ActivityResultContracts.StartActivityForResult()来处理结果,具体步骤如下:
1. 修改文件选择器声明
把原来接收String类型的Launcher改成接收Intent类型:
private var filePicker: ActivityResultLauncher<Intent>? = null
2. 重新注册文件选择器
注册时使用StartActivityForResult合约,在结果回调中处理选中的文件Uri:
private fun registerFilePicker() { filePicker = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val uri = result.data?.data uri?.let { onPickFile(it) } } } }
3. 构建带初始目录的打开文件方法
在打开文件选择器时,构建包含EXTRA_INITIAL_URI参数的Intent,指定你需要定位的目录Uri:
private fun openFilePicker() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "text/plain" // 仅显示txt文件,比*/*更精准 // 替换为你要指定的目标目录Uri,需通过SAF获取的合法Uri putExtra(DocumentsContract.EXTRA_INITIAL_URI, yourTargetDirectoryUri) } filePicker?.launch(intent) }
注意事项
yourTargetDirectoryUri必须是通过Android存储访问框架(SAF)获取的合法目录Uri,不能直接使用文件路径转换的Uri(Android 10及以上限制直接访问文件路径)。- 你原本的
onPickFile逻辑无需修改,可直接沿用。
内容的提问来源于stack exchange,提问作者Simon W
相关产品推荐
相关产品推荐

