You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Jetpack Compose拍照后图片不显示/需二次拍摄才显示,且拍照无法替换图库图片的问题求助

Jetpack Compose拍照后图片不显示/需二次拍摄才显示,且拍照无法替换图库图片的问题求助

大家好,我刚接触Jetpack Compose和Android Studio,最近遇到了两个头疼的问题:

  • 调用相机拍照后,拍摄的图片不会立刻显示出来,必须再拍一次才能看到第一次的照片
  • 拍照完成后,没办法自动替换掉之前从图库选择的图片

以下是我的代码实现:

@Composable
fun CameraScreen2(
    navigate: NavHostController
) {
    var GalleryImageUri by remember {
        mutableStateOf<Uri?>(null)
    }
    val context = LocalContext.current
    val bitmap =  remember {
        mutableStateOf<Bitmap?>(null)
    }
    var capturedImageUri by remember {
        mutableStateOf<Uri?>(null)
    }

    val Gallerylauncher = rememberLauncherForActivityResult(contract =
    ActivityResultContracts.GetContent()) { uri: Uri? ->
        if (capturedImageUri != Uri.EMPTY) capturedImageUri = Uri.EMPTY
        GalleryImageUri = uri
    }

    val file = context.createImageFile()
    var uri = FileProvider.getUriForFile(
        Objects.requireNonNull(context),
        context.packageName + ".provider", file
    )

    val cameraLauncher =
        rememberLauncherForActivityResult(ActivityResultContracts.TakePicture()){
            if (GalleryImageUri != null) GalleryImageUri = null
            capturedImageUri = uri
        }

    val permissionLauncher = rememberLauncherForActivityResult(
        ActivityResultContracts.RequestPermission()
    ){
        if (it)
        {
            Toast.makeText(context, "Permission Granted", Toast.LENGTH_SHORT).show()
            cameraLauncher.launch(uri)
        }
        else
        {
            Toast.makeText(context, "Permission Denied", Toast.LENGTH_SHORT).show()
        }
    }

    Column() {
        ElevatedButton(onClick = {
            Gallerylauncher.launch("image/*")
        }) {
            Text(text = "Pick image")
        }

        ElevatedButton(
            modifier = Modifier
                .width(190.dp),
            onClick = {
                val permissionCheckResult =
                    ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
                if (permissionCheckResult == PackageManager.PERMISSION_GRANTED) {
                    cameraLauncher.launch(uri)
                } else {
                    permissionLauncher.launch(Manifest.permission.CAMERA)
                }
            }
        ) {
            Text(text = "take from the camera")
        }

        Spacer(modifier = Modifier.height(12.dp))

        GalleryImageUri?.let {
            if (Build.VERSION.SDK_INT < 28) {
                bitmap.value = MediaStore.Images
                    .Media.getBitmap(context.contentResolver, it)
            } else {
                val source = ImageDecoder
                    .createSource(context.contentResolver, it)
                bitmap.value = ImageDecoder.decodeBitmap(source)
            }
            bitmap.value?.let { btm ->
                Image(
                    bitmap = btm.asImageBitmap(),
                    contentDescription = null,
                    modifier = Modifier.size(400.dp)
                )
            }
        }

        capturedImageUri.let {
            Log.d("URIIIIII", "CameraScreen2: $it")
            Image(
                modifier = Modifier
                    .padding(top = 0.dp, start = 10.dp, end = 10.dp)
                    .fillMaxWidth(1f)
                    .fillMaxHeight(1f),
                painter = rememberImagePainter(it),
                contentDescription = null
            )
        }
    }
}

@SuppressLint("SimpleDateFormat")
fun Context.createImageFile(): File {
    val timeStamp = SimpleDateFormat("yyyy_MM_dd_HH:mm:ss").format(Date())
    val imageFileName = "JPEG_" + timeStamp + "_"
    val image = File.createTempFile(
        imageFileName,
        ".jpg",
        externalCacheDir
    )
    return image
}

我之前尝试在cameraLauncher的回调里添加了if (capturedImageUri != Uri.EMPTY) capturedImageUri = Uri.EMPTY的判断,但问题还是没解决。现在希望能实现两个目标:

  1. 拍照完成后立刻显示拍摄的图片
  2. 拍照后自动替换掉之前从图库选择的图片

有没有大佬能帮忙分析下问题出在哪,或者给点修改建议呀?

备注:内容来源于stack exchange,提问作者Alfian

火山引擎 最新活动