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的判断,但问题还是没解决。现在希望能实现两个目标:
- 拍照完成后立刻显示拍摄的图片
- 拍照后自动替换掉之前从图库选择的图片
有没有大佬能帮忙分析下问题出在哪,或者给点修改建议呀?
备注:内容来源于stack exchange,提问作者Alfian




