我使用下面的代码在外部存储
上创建一个文件Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "audio/*"
putExtra(Intent.EXTRA_TITLE, fileName)
}.also {
startActivityForResult(it, CREATE_FILE)
}
由于startActivityForResult已弃用,我使用ActivityResultContracts.CreateDocument()。然而,我不能添加意图类型,这在上面的代码中显示为type = "audio/*">
我的代码;
val createFileIntent =
registerForActivityResult(ActivityResultContracts.CreateDocument()) { uri ->
// todo
}
// usage
createFileIntent.launch(fileName)
如何添加意图类型?
根据ActivityResultContracts.CreateDocument
的文档,你可以继承这个类来定制Intent,例如:
class CreateSpecificTypeDocument(private val type: String) :
ActivityResultContracts.CreateDocument() {
override fun createIntent(context: Context, input: String): Intent {
return super.createIntent(context, input).setType(type)
}
}
,然后注册为活动结果:
registerForActivityResult(CreateSpecificTypeDocument("audio/*")) {
// todo
}
CreateDocument()
现在已弃用,取而代之的是将mime类型作为参数的构造函数。以下是您应该如何做您正在尝试的,其中suggestedFileName
是将预填充的新文件的名称。用户可以在创建文件时更改文件的名称。实际保存的文件路径将在活动结果中返回(在我的示例中是actualFileUri
):
val createFileLauncher =
registerForActivityResult(ActivityResultContracts.CreateDocument("audio/*")) { actualFileUri ->
// do something with file URI
}
fun saveFile(suggestedFileName: String) {
createFileLauncher.launch(suggestedFileName)
}
有一点需要注意——确保ActivityResultLauncher
是成员变量,而不是saveFile
函数中的局部变量。否则,它可能会超出作用域并被垃圾收集,并且intent永远不会被启动。