如何使用ActivityResultContracts.CreateDocument()来添加intent类型



我使用下面的代码在外部存储

上创建一个文件
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永远不会被启动。

相关内容

  • 没有找到相关文章

最新更新