如何在使用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
相关产品推荐
相关产品推荐

