You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用ActivityResultLauncher.GetContent()时指定多个MIME类型?

解决方案

ActivityResultContracts.GetContent 原生仅支持传入单个MIME类型,你之前用|拼接多类型的写法系统无法识别,因此不会生效。要实现同时选择图片和PDF文件,有两种常用方案:

方案1:使用官方内置的 ActivityResultContracts.OpenDocument(推荐)

这个Contract原生支持传入多MIME类型数组,用法如下:

// 注册结果回调
val pickFileLauncher = registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri: Uri? ->
    // 处理返回结果,用户取消选择时uri为null
    uri?.let {
        // 你的业务逻辑
    }
}

// 启动选择器,传入需要支持的所有MIME类型数组
pickFileLauncher.launch(arrayOf("image/*", "application/pdf"))

注意:OpenDocument 走的是系统存储访问框架(SAF)的选择逻辑,和GetContent的UI和行为基本一致,大部分场景下可以直接替换

方案2:自定义ActivityResultContract

如果你有特殊需求必须沿用GetContent的底层逻辑,也可以自定义Contract来支持多类型:

class GetMultipleContents : ActivityResultContract<Array<String>, Uri?>() {
    override fun createIntent(context: Context, input: Array<String>): Intent {
        return Intent(Intent.ACTION_GET_CONTENT)
            .setType("*/*")
            .putExtra(Intent.EXTRA_MIME_TYPES, input)
            .addCategory(Intent.CATEGORY_OPENABLE)
    }

    override fun parseResult(resultCode: Int, intent: Intent?): Uri? {
        return if (resultCode == Activity.RESULT_OK) intent?.data else null
    }
}

自定义后的用法和OpenDocument一致:

val customPickLauncher = registerForActivityResult(GetMultipleContents()) { uri: Uri? ->
    // 处理结果
}
customPickLauncher.launch(arrayOf("image/*", "application/pdf"))

内容的提问来源于stack exchange,提问作者TabascoLosco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:12:04