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

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

我正在尝试通过单击按钮(可组合函数)来启动文件选择器。无法使用

startActivityForResult()

@Composable
fun SelectScreen() {

    Button(onClick = {
        val intent = Intent(Intent.ACTION_GET_CONTENT)
        startActivity(intent)
    }
    ) {
        Text("BUTTON")
    }
}
android kotlin android-jetpack-compose filechooser filepicker
5个回答
18
投票

这是我的建议:

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
)

7
投票

您可以使用

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 {
   //...
}

2
投票

在撰写中使用“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")
}

}


0
投票

这不是答案,但

startActivity
仅在活动上下文中可用,而不是在组合中,您需要在某处解析
context
才能使用它
context.startActivity

对于

onActivityResult
有一种新方法可以做到,请查看:OnActivityResult 方法已弃用,有什么替代方法?


0
投票

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

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")
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.