在registerForActivityResult 上获取数据为空

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

因此,一切正常,良好的相机正在打开,如果没有权限,权限对话框也会打开,但图像不会显示在图像视图中。因为我在 result.data?.data

上得到 null

这是我为捕获的图像创建路径并打开相机的功能

        fun displayCamera(activity: Activity) {
        val destPath: String? = Objects.requireNonNull(
            Objects.requireNonNull(activity).getExternalFilesDir(null)!!
        ).absolutePath

        val imagesFolder = File(destPath, activity.resources.getString(R.string.app_name))
        try {
            imagesFolder.mkdirs()
            val imgFile = File(imagesFolder, Date().time.toString() + ".jpg")
            val imagePath = FileProvider.getUriForFile(
                activity, "com.example.shoppinglist" + ".provider", imgFile
            )
            val intent = Intent(ACTION_IMAGE_CAPTURE)
            intent.putExtra(EXTRA_OUTPUT, imagePath)
            cameraResult.launch(intent)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

2.这是我的registerForActivity结果变量


          private val cameraResult = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result: ActivityResult ->
        if (result.resultCode == Activity.RESULT_OK) {
            binding.profilepic.setImageURI(result.data?.data)
        }
    }

3.这是我在单击按钮时调用此函数的代码

         if (checkPermissions(this@RegistrationActivity)) {
                    displayCamera(this@RegistrationActivity)
                } else {
                    requestPermission(requestMultiplePermissionLauncher)
                }
kotlin android-intent android-camera
1个回答
0
投票

您的代码似乎没问题,但如果您将其与静态包名称和存储权限以及不同的 Android 版本集成,有时

FileProvider
会出现问题。

您可以尝试下面的代码,该代码工作正常,并且还有助于管理存储,因为它不会存储图像,它会直接为您提供从我们打开的相机意图中捕获的图像的位图,然后显示在您的内部

imageView
通过从启动器获取位图数据的结果。

只需使用以下代码更改您的代码即可。

private fun displayCamera() {
    val intent = Intent(ACTION_IMAGE_CAPTURE)
    cameraResult.launch(intent)
}

cameraResult = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result: ActivityResult ->
        if (result.resultCode == Activity.RESULT_OK) {
            val imageBitmap = result.data?.extras?.get("data") as Bitmap
            binding.profilepic.setImageBitmap(imageBitmap)
        }
}
© www.soinside.com 2019 - 2024. All rights reserved.