正如我从许多实现中了解到的,例如:
https://github.com/android/camera-samples/tree/master/CameraXBasic
https://proandroiddev.com/android-camerax-preview-analyze-capture-1b3f403a9395
在cameraProvide.bindToLifecycle()实现中的每个用例之后,都需要调用CameraX方法。
例如,如果我需要从默认关闭模式打开相机的FLASH_MODE,那么同样需要调用bindToLifecycle()方法。
这种方法的缺点是,在一两秒钟内,预览会被删除并重新附加,这并不像一个应用程序的平稳过渡。
有更好的实践吗?还是有局限性?
我附上了下面的示例代码:
private void bindCameraUseCase() {
int screenAspectRatio = getAspectRatio(previewView.getWidth(), previewView.getHeight());
int rotation = previewView.getDisplay().getRotation();
preview = new Preview.Builder()
.setTargetAspectRatio(screenAspectRatio)
.setTargetRotation(rotation)
.build();
cameraSelector = new CameraSelector.Builder()
.requireLensFacing(lensFacing)
.build();
imageCapture = new ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.setTargetAspectRatio(screenAspectRatio)
.setTargetRotation(rotation)
.setFlashMode(flashMode)
.build();
// Must unbind the use-cases before rebinding them
cameraProvider.unbindAll();
preview.setSurfaceProvider(previewView.createSurfaceProvider());
camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);
}
并拨动手电筒:
private void toggleFlash(){
Log.d(TAG, "toggleFlash: "+flashMode);
switch (flashMode){
case ImageCapture.FLASH_MODE_OFF:
flashMode = ImageCapture.FLASH_MODE_ON;
flashButton.setBackgroundResource(R.drawable.ic_flash_on_24dp);
break;
case ImageCapture.FLASH_MODE_ON:
flashMode = ImageCapture.FLASH_MODE_AUTO;
break;
case ImageCapture.FLASH_MODE_AUTO:
flashMode = ImageCapture.FLASH_MODE_OFF;
break;
}
bindCameraUseCase();
}
我正在使用CameraX版本- 1.0.0-beta04
发布于 2020-06-05 17:59:37
要在创建ImageCapture
实例并将其绑定到生命周期之后,在图像捕获期间启用或禁用闪存,可以使用ImageCapture.setFlashMode(boolean)
。
关于在绑定ImageCapture
用例之前和之后设置闪存模式之间的区别的问题,AFAIK并没有太大的差别。当您通过调用ImageCapture.takePicture()
拍照时,会使用不同的配置参数构建捕获请求,其中之一是flash模式。因此,只要在此调用(ImageCapture.takePicture()
)之前设置了闪存模式,捕获请求的输出就应该是相同的。
CameraX目前使用遮罩下的Camera2,为了更好地理解拍照时如何设置闪存模式,您可以查看模式。
发布于 2020-12-31 04:15:26
我看到ImageCapture.flashMode只在我们使用初始配置、ImageCapture.Builder()等进行构建时才有效果。但是如果您想动态启用/禁用闪存,则必须使用以下方法。
camera?.cameraControl?.enableTorch(enableFlash)
如果你想知道什么是照相机?从文档中得到的。
// A variable number of use-cases can be passed here -
// camera provides access to CameraControl & CameraInfo
camera = cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture
)
https://stackoverflow.com/questions/62204461
复制相似问题