我如何在撰写中使用意图启动文件选择器



我试图在按钮单击上启动文件选择器(可组合功能)。无法使用startActivityForResult().

@Composable
fun SelectScreen() {
Button(onClick = {
val intent = Intent(Intent.ACTION_GET_CONTENT)
startActivity(intent)
}
) {
Text("BUTTON")
}
}

我的建议是:

val pickPictureLauncher = rememberLauncherForActivityResult(
ActivityResultContracts.GetContent()
) { imageUri ->
if (imageUri != null) {
// Update the state with the Uri
}
}
// In your button's click
pickPictureLauncher.launch("image/*")

和显示图像的可组合文件中,您可以执行以下操作

val image = remember {
// Make sure to resize and compress
// the image to avoid display a big bitmap
ImageUtils.imageFromUri(imageUi)
}
Image(
image,
contentDescription = null
)

您可以使用rememberLauncherForActivityResult()将请求注册到Activity#startActivityForResult,由给定的ActivityResultContract指定。

这将在ActivityResultRegistry中创建与该调用者相关联的记录,管理请求代码,以及在底层到/从Intent转换。

类似:

val result = remember { mutableStateOf<Uri?>(null) }
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocument()) {
result.value = it
}
Button(onClick = { launcher.launch(arrayOf("image/*")) }) {
Text(text = "Open Document")
}
result.value?.let {
//...
}

使用"startActivityForResult()"在写作中,我找到了这个解决方案,它对我有效
@Composable
fun SelectScreen() {
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.type = "*/*";
intent.addCategory(Intent.CATEGORY_OPENABLE);
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {}
Button(onClick = {
launcher.launch(intent)
}) {
Text(text = "Take a picture")
}

}

这不是一个答案,但startActivity仅在活动的上下文中可用,而不是在组成中,您需要在某处解析context以使用它context.startActivity

onActivityResult有一个新的方法来做,看看这个:OnActivityResult方法被弃用,什么是替代方案?

你必须从一个有效的上下文中开始一个活动,它可以是您的应用程序上下文或活动。如果你不需要从一个活动返回结果,这意味着你不是为了结果而启动这个活动,那么你也可以从应用程序上下文启动。

companion object{
var mContext : Context? = null
/*
* should set your mContext variable value to this in your activity onCreate,    onStart
* and set to null in your onStop to avoid leaks
*/
fun getActivityContext() : Context{
return mContext;
}

fun getApplicationContext() : Context{
return ApplicationClass.getInstance()
}
}

@Composable
fun SelectScreen() {
Button(onClick = {
val intent = Intent(Intent.ACTION_GET_CONTENT)
getActivityContext().startActivity(intent)
}
) {
Text("BUTTON")
}
}

最新更新