Я хочу делать снимки экрана предварительного просмотра камеры (в формате jpg) в хранилище кэша, когда на устройстве происходит событие (это событие вызывает Блок LaunchedEffect).
Мой текущий код выглядит так:
Код: Выделить всё
@Composable
fun CameraScreen() {
val coroutineScope = rememberCoroutineScope()
val lifecycle = LocalLifecycleOwner.current
val ctx = LocalContext.current
val vm = viewModel()
var cameraProvider: ProcessCameraProvider
var cameraPreviewView = PreviewView(ctx).apply {
this.scaleType = scaleType
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
implementationMode = PreviewView.ImplementationMode.COMPATIBLE
}
val imageCapture by remember {
mutableStateOf(
ImageCapture.Builder()
.setJpegQuality(80)
.setResolutionSelector(
ResolutionSelector.Builder()
.setResolutionStrategy(
ResolutionStrategy(
Size(640, 480),
ResolutionStrategy.FALLBACK_RULE_CLOSEST_HIGHER_THEN_LOWER
)
)
.setAspectRatioStrategy(AspectRatioStrategy.RATIO_4_3_FALLBACK_AUTO_STRATEGY)
.build()
)
.setCaptureMode(CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
)
}
LaunchedEffect(vm.eventHappened) {
if (vm.eventHappened) {
val bitmap = cameraPreviewView.bitmap // !!! HERE BITMAP IS ALWAYS NULL
if (bitmap != null) {
saveBitmapImageToFile(vm.photoFile, bitmap)
}
}
}
Box(
modifier = Modifier.fillMaxSize()
) {
AndroidView(
modifier = Modifier.width(pixelToDp(640)).height(pixelToDp(480)),
factory = { context ->
val previewUseCase = Preview.Builder()
.build()
.also {
it.surfaceProvider = cameraPreviewView.surfaceProvider
}
coroutineScope.launch {
val cameraProviderFuture = ProcessCameraProvider.getInstance(ctx)
cameraProviderFuture.addListener({
cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.Builder()
.apply {
requireLensFacing(CameraSelector.LENS_FACING_BACK)
}.build()
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(lifecycle, cameraSelector, previewUseCase, imageCapture)
}, ContextCompat.getMainExecutor(ctx))
}
cameraPreviewView
}
)
}
}
Я также пробовал вызвать cameraPreviewView.drawToBitmap(), но это дает сбой, за исключением того, что перед вызовом drawToBitmap() необходимо создать представление View
Спасибо за вся помощь.
Подробнее здесь: https://stackoverflow.com/questions/792 ... is-working