有没有一种方法可以使用 intent.setType()
并同时提供多个广泛的类型(比如图片和视频)?
我正在使用一个 ACTION_GET_CONTENT
。它似乎只能使用逗号分隔的类型。
有没有一种方法可以使用 intent.setType()
并同时提供多个广泛的类型(比如图片和视频)?
我正在使用一个 ACTION_GET_CONTENT
。它似乎只能使用逗号分隔的类型。
在使用存储访问框架时,Android 4.4可以使用EXTRA_MIME_TYPES
传递多个MIME类型。
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
String[] mimetypes = {"image/*", "video/*"};
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
startActivityForResult(intent, REQUEST_CODE_OPEN);
EXTRA_MIME_TYPES
不能替代setType
。使用这个方法时,你仍然需要使用setType
函数。 - arlomedia实际上,支持多个MIME类型。你试过吗?
例如:intent.setType("image/*,video/*")
将显示照片和视频...
对我来说有效。对你也应该有效...
[编辑]: 这部分有效,但并非所有图库应用程序都选择实现对多个MIME类型筛选的支持。
抱歉,目前不支持此功能。您有两个选项:
(1) 使用 MIME 类型 */*
,接受用户可能会选择一些您无法处理的内容(并为此提供合适的恢复路径);或者
(2) 实现自己的活动选择器,在包管理器上进行直接调用,获取可以处理意图的 MIME 类型的活动的列表,将这些列表合并,并将其显示给用户。
另外,setType()
不支持逗号分隔的类型。它必须是一个且仅有一个 MIME 类型。
对我而言,最有效的方法是:
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
您可以像这样添加多个MIME类型
intent.setType("image/*|application/pdf|audio/*");
但是,意图选择器只会显示可以处理图像的应用程序,因为它是mime类型字符串中的第一个。
然而,如果您安装了文件管理器(我使用CyanogenMod文件管理器进行测试),则可以选择音频、pdf或图像文件。
如果音频mime类型是第一个,就像这样:
intent.setType("audio/*|image/*|application/pdf");
意图选择器将只显示处理音频的应用程序。
同样,使用文件管理器,您可以选择图像、PDF或音频。
Intent.setType("application/*|text/*");
registerForActivityResult()
回调函数:import androidx.activity.result.contract.ActivityResultContracts
class DocumentsFragment : Fragment() {
companion object {
// 1. List of MIME types
/**@see <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types">MIME types</a>
* @see <a href="https://www.iana.org/assignments/media-types/media-types.xhtml">IANA - MIME types</a>*/
private val MIME_TYPES: Array<String> = arrayOf(
"image/*", "application/pdf", "application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/vnd.oasis.opendocument.text", "text/plain", "text/markdown"
)
}
//2. Register for Activity Result callback as class field
private val getDocuments =
registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()/*NOT OpenDocument*/) {
Log.d("Open documents", "incoming uri: size = ${it.size}")
add(it)
}
...
//3. set onclick listener
selectDocumentsButton.setOnClickListener { getDocuments.launch(MIME_TYPES) }
...
//4. handle incoming uri list
private fun add(list: List<Uri>) {
val setOfFiles = copyToAppDir(list)
setOfFiles.forEach {
//TODO: do something
}
}
//5. copy the files to the application folder for further work
private fun copyToAppDir(list: List<Uri>): Set<File> {
val set = mutableSetOf<File>()
list.forEach { uri ->
try {
val file: File = copyUriContentToTempFile(uri)
set.add(file)
} catch (e: Exception) {
e.printStackTrace()
}
}
return set
}
//6. copy selected content by uri
private fun copyUriContentToTempFile(uri: Uri): File {
val inputStream = requireContext().contentResolver.openInputStream(uri)
inputStream.use { input ->
val tempFile: File = .. ; //TODO: create file
tempFile.outputStream().use { output ->
input?.copyTo(output)
}
return tempFile
}
}
}
关于我的分号工作。
示例:
intent.setType("image/*;video/*")
或者
sIntent.putExtra("CONTENT_TYPE", "image/*;video/*");
Intent.EXTRA_MIME_TYPES
常量代替硬编码的"CONTENT_TYPE"字符串。此外,你可以传递一个字符串数组来代替分号。 - Fred