Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 每次在CameraX库中创建预览后,是否需要bindToLifecycle()来打开/关闭/自动闪烁_Android_Android Camerax - Fatal编程技术网

Android 每次在CameraX库中创建预览后,是否需要bindToLifecycle()来打开/关闭/自动闪烁

Android 每次在CameraX库中创建预览后,是否需要bindToLifecycle()来打开/关闭/自动闪烁,android,android-camerax,Android,Android Camerax,据我从许多实施中了解,例如: 在CameraX实现中的每个用例之后,都需要调用cameraProvide.bindToLifecycle()方法 例如,如果我需要从默认关闭模式打开相机的闪光灯模式,那么需要再次调用bindToLifecycle()方法 这种方法的缺点是,在一两秒钟内,预览会被删除并重新连接,这让应用程序感觉不到平滑过渡 是否有更好的做法或限制? 我在下面附上了一个示例代码: private void bindCameraUseCase() { int scre

据我从许多实施中了解,例如:

在CameraX实现中的每个用例之后,都需要调用cameraProvide.bindToLifecycle()方法

例如,如果我需要从默认关闭模式打开相机的闪光灯模式,那么需要再次调用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

在创建
ImageCapture
实例并将其绑定到生命周期后,可以使用

关于绑定
ImageCapture
用例之前和之后设置flash模式之间的区别,您的问题是,AFAIK实际上没有太大区别。当您通过调用
ImageCapture.takePicture()
拍摄照片时,会使用不同的配置参数生成一个捕获请求,其中一个是flash模式。因此,只要在此调用之前设置了flash模式(
ImageCapture.takePicture()
),捕获请求的输出就应该是相同的


CameraX目前在引擎盖下使用Camera2,为了更好地了解拍照时如何设置闪光灯模式,您可以查看。

我看到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
)

如果你想控制火炬,比如打开和关闭火炬,你可以考虑使用。它不需要重新绑定用例,您可以在绑定发生后获得一个
CameraControl
实例。不,我是在构建imageCapture对象时单击图片时查看flash的。如果flash模式被更改,那么我需要再次调用bindToLifecylce(),这将在一两秒钟内删除预览,我觉得这不是平滑过渡?或者有其他方法吗?如果在设置
ImageCapture
后需要更改闪光模式,您只需使用,它为后续拍摄的图像定义了闪光模式。这就是你要找的吗?是的,这就是我要找的,而且很好用。非常感谢。一个小的后续问题。ImageCapture用例已绑定到生命周期。在不重新绑定到生命周期的情况下,如何更改用例的功能(例如我的用例的flash模式)?任何需要了解的相关资源都可以!