我用相机在构图中拍照。摄像机预览代码^
@Composable
fun CameraPreview(
modifier: Modifier = Modifier,
scaleType: PreviewView.ScaleType = PreviewView.ScaleType.FILL_CENTER,
onUseCase: (UseCase) -> Unit = { }
) {
AndroidView(
modifier = modifier,
factory = { context ->
val previewView = PreviewView(context).apply {
this.scaleType = scaleType
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
}
onUseCase(
Preview.Builder()
.build()
.also {
it.setSurfaceProvider(previewView.surfaceProvider)
}
)
previewView
}
)
}
拍照代码
@Composable
fun CameraCapture(
modifier: Modifier = Modifier,
cameraSelector: CameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA,
onPhotoCreated: (Bitmap, String) -> Unit = { bitmap, string -> bitmap; string},
onClose: () -> Unit,
onFullScreen: (Boolean) -> Unit = {},
systemUiController: SystemUiController = rememberSystemUiController()
) {
var isFullScreen by remember { mutableStateOf(true) }
onFullScreen(isFullScreen)
WindowCutoutMode(isFullScreen = isFullScreen)
SystemBarColor(
systemUiController = systemUiController,
specialStatusColor = Color.Transparent
)
Box(modifier = modifier) {
val context = LocalContext.current
val lifecycleOwner = LocalLifecycleOwner.current
var previewUseCase by remember { mutableStateOf<UseCase>(Preview.Builder().build()) }
CameraPreview(
modifier = Modifier.fillMaxSize(),
onUseCase = {
previewUseCase = it
}
)
var newSelector by remember { mutableStateOf(cameraSelector) }
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
val cameraProvider = cameraProviderFuture.get()
val cameraExecutor: ExecutorService = Executors.newSingleThreadExecutor()
val imageCaptureUseCase by remember {
mutableStateOf(
ImageCapture.Builder()
.setCaptureMode(CAPTURE_MODE_MAXIMIZE_QUALITY)
.build()
)
}
val coroutineScope = rememberCoroutineScope()
Box(
modifier = Modifier
.align(Alignment.TopStart)
.padding(top = 48.dp, start = 16.dp)
.clip(CircleShape)
.background(Colors.Background.transparent)
) {
Icon(
imageVector = Icons.Rounded.Close,
contentDescription = null,
modifier = Modifier
.clickable(
role = Role.Button
) {
isFullScreen = false
onClose()
},
)
}
Row(
modifier = Modifier
.fillMaxWidth()
.background(Colors.Background.light)
.align(Alignment.BottomCenter),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
GalleryImagePicker(onPhotoCreated)
Box(
modifier = Modifier
.size(100.dp)
.padding(16.dp)
.clip(CircleShape)
.background(Color.White),
) {
Box(
modifier = Modifier
.size(80.dp)
.padding(5.dp)
.clickable(
role = Role.Button
) {
coroutineScope.launch(Dispatchers.IO) {
val imageFile = imageCaptureUseCase.takePicture(cameraExecutor)
onPhotoCreated(rotateByOrientation(imageFile), imageFile.name)
}
}
.clip(CircleShape)
.background(Color.Black),
) {
}
}
Box(
modifier = Modifier
.size(80.dp)
.padding(16.dp)
.clip(CircleShape)
.background(Color.White),
) {
Box(
modifier = Modifier
.size(60.dp)
.padding(5.dp)
.clip(CircleShape)
.background(Color.Black),
) {
Icon(
imageVector = ImageVector.vectorResource(id = R.drawable.ic_camera_change),
contentDescription = "",
tint = Color.White,
modifier = Modifier
.align(Alignment.Center)
.clickable(
role = Role.Button
) {
newSelector =
if (newSelector == CameraSelector.DEFAULT_FRONT_CAMERA)
CameraSelector.DEFAULT_BACK_CAMERA
else
CameraSelector.DEFAULT_FRONT_CAMERA
}
)
}
}
}
LaunchedEffect(newSelector) {
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
lifecycleOwner,
newSelector,
previewUseCase,
imageCaptureUseCase
)
} catch (ex: Exception) {
Log.e("CameraCapture", "Failed to bind camera use cases", ex)
}
}
}
}
代码一直运行良好,但突然(本周),它开始处理像java.lang.IllegalArgumentException: Provided camera selector unable to resolve a camera for the given use case
这样的异常,消息无法绑定摄像机用例。当视图打开时,它只有黑色屏幕。代码没有改变,我看不见错误。
版本:
"androidx.camera:camera-core:1.0.1""
"androidx.camera:camera-camera2:1.0.1""
"androidx.camera:camera-lifecycle:1.0.1""
"androidx.camera:camera-view:1.1.0-beta02"
"androidx.camera:camera-extensions:1.1.0-beta02"
更新
日志中的其他一些例外:
Camera LensFacing verification failed, existing cameras: []
CameraValidator$CameraIdListIncorrectException: Expected camera missing from device.
更新2
在设备重新启动异常消失后,预览是黑色屏幕,它每秒钟发送一次日志消息,如
D/Camera2CameraImpl:{Camera@739281did=1}转换摄像机内部状态:打开->关闭
发布于 2022-05-12 20:29:15
必须重新批准。
编辑:您是否确保目前没有其他应用程序使用该相机?如果打开了内部状态,则可能与使用该资源的另一个源发生冲突。
发布于 2022-08-30 05:07:27
当我遵循下面的教程时,我得到了相同的错误
我可以通过改变
从…
val lensFacing = CameraSelector.LENS_FACING_BACK
至
val lensFacing = CameraSelector.LENS_FACING_FRONT
所以,如果您想使用前端还是反相机,这是不同的。
在我的情况下,我只有一个前摄像头。
现在,来看上面的代码,我可以看到您向LaunchedEffect提供包含CameraSelector.DEFAULT_BACK_CAMERA或CameraSelector.DEFAULT_FRONT_CAMERA的newSelector。
但是,正如我前面所说的,CameraSelector.LENS_FACING_FRONT为我工作,所以我认为您需要将它们都更改为
if (newSelector == CameraSelector.LENS_FACING_BACK)
CameraSelector.LENS_FACING_BACK
else
CameraSelector.LENS_FACING_BACK
https://stackoverflow.com/questions/72217146
复制相似问题