如何在Compose中使用Intent启动文件选择器

8
我正在尝试在按钮点击时启动文件选择器(可组合函数)。无法使用 startActivityForResult() 方法。
@Composable
fun SelectScreen() {

    Button(onClick = {
        val intent = Intent(Intent.ACTION_GET_CONTENT)
        startActivity(intent)
    }
    ) {
        Text("BUTTON")
    }
}
5个回答

19

这是我的建议:

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
)

我们可以输入预定义的路径,这样当文件选择器被打开时,它将会打开指定的文件夹吗? - nhoxbypass

7
您可以使用 rememberLauncherForActivityResult() 来注册一个请求到指定的 ActivityResultContract,以便用于调用 Activity#startActivityForResult
这将在与该调用方相关联的 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

在使用compose中的"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

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

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")
    }
}

我正在尝试使用意图启动文件选择器,但是失败了。 - Hitesh Patel
你具体是怎么失败的?如果是异常,你能否发布你的堆栈跟踪信息? - Wajid

0

这不是一个答案,但是startActivity只能在Activity的上下文中使用,而不能在Compose中使用。您需要在某个地方解析context以使用它:context.startActivity

对于onActivityResult,有一种新的方法可以使用,请查看此链接:OnActivityResult方法已弃用,有什么替代方法?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接