我如何使用 ActivityResultLauncher.GetContent() 请求多个 MIME 类型?

Tab*_*sco 4 android mime-types

我试图从用户那里检索一个可以是图像或 pdf 的文件,使用

registerForActivityResult(ActivityResultContracts.GetContent()) { file: Uri ->
   ......
}.launch(<mimetypes>)

Run Code Online (Sandbox Code Playgroud)

我已经尝试"image/*|application/pdf"过另一个问题的答案,但它不起作用,有没有办法在使用 registerForActivityResult 时要求多个 MIME 类型?

Com*_*are 6

使用 registerForActivityResult 时有什么方法可以要求多个 MIME 类型吗?

不能直接使用当前版本的ActivityResultContracts.GetContent. 但是,您应该能够对其进行子类化、覆盖createIntent(),并从那里自定义生成的Intent. 然后,您可以尝试添加EXTRA_MIME_TYPES您想要的其他 MIME 类型IntentString[]


小智 5

这是我的示例代码,在 api 31 中测试

var resultGalleryLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            val intent: Intent? = result.data
            if (intent != null) {
                intent.data?.let { selectedImageUri ->
                     ....  
                    }
                }
            } else {
                Timber.e(" >>> error selected image from gallery by intent")
            }
        }
    }


fun galleryLauncher() {
    val intent = Intent(Intent.ACTION_GET_CONTENT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI).apply {
        type = "image/*"
        action = Intent.ACTION_GET_CONTENT
        putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/jpeg", "image/png", "image/jpg"))
        putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false)
    }
    resultGalleryLauncher.launch(intent)
}
Run Code Online (Sandbox Code Playgroud)