如何使用 Jetpack Compose Photo Picker 仅过滤和选择 PNG 图像?

How can I filter and select only PNG images with Jetpack Compose Photo Picker?

提问人:Kalpesh Doru 提问时间:10/28/2023 最后编辑:Peter MortensenKalpesh Doru 更新时间:10/30/2023 访问量:93

问:

我正在使用 Jetpack Compose 和照片选取器来允许用户在我的应用中选择图像。但是,我想将选择限制为仅PNG图像。在 Jetpack Compose 中使用照片选取器时,如何实现此过滤器?

这是我使用onClick按钮打开Photo Picker的代码:

val multiplePhotoPickerLauncher = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.PickMultipleVisualMedia(),
    onResult = { uris -> })

// Below code for open image picker
Button(modifier = Modifier
                    .fillMaxWidth()
                    .bounceClick(),
                colors = ButtonDefaults.buttonColors(
                    White, disabledContainerColor = White80,
                    disabledContentColor = White
                ),
                onClick = {
                    multiplePhotoPickerLauncher.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)
                    )
                }
            ) {
                Text(
                    color = Black80,
                    text = "${attachments.size} / 10"
                )
            }
安卓 android-jetpack-compose imagepicker

评论

0赞 blackapps 10/28/2023
您可以将 mime 类型设置为 image/png。
0赞 blackapps 10/28/2023
medium.com/@everydayprogrammer/......

答:

0赞 ftm.amani 10/28/2023 #1

您应该像这样设置 MIME 类型

val mimeType = "image/png"


onClick = {
            multiplePhotoPickerLauncher.launch(
                PickVisualMediaRequest(
                    ActivityResultContracts
                        .PickVisualMedia.SingleMimeType(mimeType))
            )
        }
-1赞 Zobaer Hossain 10/28/2023 #2

以下是有关如何执行此操作的分步指南:

  1. 实现自定义过滤逻辑以仅过滤 PNG 图像。

  2. 在启动照片选取器之前修改代码以处理筛选器。

  3. 向用户显示筛选后的结果。

下面是如何实现此目的的示例:

val multiplePhotoPickerLauncher = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.GetContent(),
    onResult = { uris ->
        // Filter the selected uris to retain only PNG images
        val pngUris = uris.filter { uri ->
            val mimeType = contentResolver.getType(uri)
            mimeType?.startsWith("image/png") == true
        }

        // Now you have a list of PNG image URIs in pngUris
        // Do something with them
    }
)

Button(
    modifier = Modifier.fillMaxWidth(),
    onClick = {
        // Launch the Photo Picker
        val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
            type = "image/*"
            putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/png"))
            addCategory(Intent.CATEGORY_OPENABLE)
            putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
        }
        multiplePhotoPickerLauncher.launch(intent)
    }
) {
    Text(text = "Select PNG Images")
}

在此代码中,我们用于选择任何类型的图像(“image/*”)并指定 MIME 类型“image/png”以在启动照片选择器时仅过滤 PNG 图像。用户选择图像后,我们会根据其 MIME 类型筛选 URI,以仅保留 PNG 图像。ActivityResultContracts.GetContent()

评论

0赞 blackapps 10/29/2023
因此,用户选择了 10 个 jpg、2 个 gif 和 4 个 png,而您只给他留下 png。多么可爱。
0赞 Zobaer Hossain 10/29/2023
@blackapps请阅读问题标题,用户只想显示 png。
2赞 blackapps 10/29/2023
不。该应用程序的程序员希望用户只能选择 png。使用您的“解决方案”,用户仍然可以选择所有类型的图像。
1赞 blackapps 10/29/2023
如果用户只能选择 png,则不必在 onActivityResult 中过滤 png 的 uri。
0赞 Peter Mortensen 11/22/2023
这个答案是由 ChatGPT(或类似)生成的吗?