如何仅选择GIF文件

3
我希望能够分别选择图片(JPG,PNG)和GIF(gif)文件。这适用于大多数图库应用程序和文件管理器,但不包括Google相册应用程序。当我使用Google相册应用程序选择图像或gif时,所有图像都会显示,即JPG,PNG,GIF,BMP等。如何告诉Google照片仅允许选择特定类型的文件?
以下是我的代码:
val contentPicker = activity.registerForActivityResult(
    ActivityResultContracts.GetContent()
) { uri: Uri? ->
    // Use Picked URI
}

val mime = when {
    MediaType.isPhoto(mediaType) -> "image/*" // or image/jpg or image/png
    MediaType.isGif(mediaType) -> "image/gif"
    else -> throw RuntimeException("Wrong Media Type to pick: $mediaType")
}

contentPicker.launch(mime)

如果有其他方法(可能只针对Google照片),请作为答案分享。我找不到任何相关问题和适当的答案。我想仅使用系统应用程序来选择内容。

picker activity

编辑(2021年11月23日)

即使我使用以下意图打开文件应用程序,用户仍然可以转到侧边栏并选择照片应用程序。文件应用程序会阻止选择gif / heic图像。但是,当从文件应用程序中打开照片应用程序时,用户可以无限制地选择gif / heic图像。

fun getPickPhotoIntent(): Intent {

    val pickIntent = Intent(Intent.ACTION_GET_CONTENT)
    pickIntent.addCategory(Intent.CATEGORY_OPENABLE)
    pickIntent.type = "image/jpg"

    val mimeTypes = arrayOf("image/bmp", "image/jpeg", "image/png")
    pickIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes)
    pickIntent.putExtra(Intent.EXTRA_LOCAL_ONLY, true)

    return pickIntent
}

1
我想要补充一点,检查MIME类型并不像检查十六进制签名那样可靠,因为MIME类型可以被伪造。gif文件的十六进制签名分别是:47 49 46 38 37 61和47 49 46 38 39 61,对应版本分别为7a和9a。 - Jordan Stubblefield
@JordanStubblefield,如果我有目标文件的路径,是否有可靠的工作库可以通过文件头(十六进制签名)检查文件类型?如果我可以检查所选文件是否为所需类型,我认为我可以处理这个问题。 - rupinderjeet
我没有找到,不过你可以使用File.inputStream来读取文件头。这可能是事后才能处理有效文件的方式。 - Jordan Stubblefield
1个回答

0
fun getPickPhotoIntent(): Intent {

val pickIntent = Intent(com.google.android.apps.photos.picker.external.ExternalPickerActivity)//package name Used
pickIntent.addCategory(Intent.CATEGORY_OPENABLE)
pickIntent.type = "image/jpg"

val mimeTypes = arrayOf("image/bmp", "image/jpeg", "image/png")
pickIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes)
pickIntent.putExtra(Intent.EXTRA_LOCAL_ONLY, true)

return pickIntent
}

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
这种方法很容易在活动更改的情况下出现故障。我想使用标准的Android指南来获取内容,即通过意图操作。 - rupinderjeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接