使用Intent.ACTION_PICK选择多个媒体项?

问题描述 投票:0回答:2

我正在编写一个应用程序,允许用户从 SD 卡中选择多个音乐曲目并播放它们。我正在尝试使用 Intent 系统来选择多个媒体实例,但我只能找到一种方法来选择单个项目。

这是我正在使用的代码:

Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, REQUEST_MEDIA);

由于有一个操作“ACTION_SEND_MULTIPLE”,我认为也会有多个版本的选择操作,但我找不到任何版本。那么,是否可能?如果可以,该采取什么行动?

android android-intent
2个回答
2
投票

不幸的是我也遇到了同样的问题。无法使用 Intent.ACTION_PICK 选择多个项目。我采取的方法是创建自己的自定义 GridView 供用户选择多个项目。您可以采用类似的方法在自定义视图中显示所有 mp3 文件。


0
投票

我认为所选答案不正确。 这取决于将打开的应用程序来选择文件(图像、视频等)。

例如,如果您安装了 Google Photos,确实可以 使用

Intent.ACTION_PICK
来显示多个图像。

        val pickIntent = Intent(Intent.ACTION_PICK).apply {
        putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
        setType("image/*")
    }

这将打开 Google Photos,并为用户提供选择多个照片的选项 长按图像。

Contract
活动结果将是clipData。

    override fun parseResult(resultCode: Int, intent: Intent?): List<Uri> {
    return intent?.takeIf { resultCode == RESULT_OK }?.getClipDataUris() ?: emptyList()
}

/**
 * @see ActivityResultContracts.GetMultipleContents
 */
private fun Intent.getClipDataUris(): List<Uri> {
    // Use a LinkedHashSet to maintain any ordering that may be
    // present in the ClipData
    val resultSet = LinkedHashSet<Uri>()
    data?.let { data ->
        resultSet.add(data)
    }
    val clipData = clipData
    if (clipData == null && resultSet.isEmpty()) {
        return emptyList()
    } else if (clipData != null) {
        for (i in 0 until clipData.itemCount) {
            val uri = clipData.getItemAt(i).uri
            if (uri != null) {
                resultSet.add(uri)
            }
        }
    }
    return ArrayList(resultSet)
}
© www.soinside.com 2019 - 2024. All rights reserved.