首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >bindToLifecycle()是否需要每次在CameraX库中创建预览后打开/关闭/自动闪存?

bindToLifecycle()是否需要每次在CameraX库中创建预览后打开/关闭/自动闪存?
EN

Stack Overflow用户
提问于 2020-06-04 21:30:19
回答 2查看 1.5K关注 0票数 2

正如我从许多实现中了解到的,例如:

https://github.com/android/camera-samples/tree/master/CameraXBasic

https://proandroiddev.com/android-camerax-preview-analyze-capture-1b3f403a9395

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

例如,如果我需要从默认关闭模式打开相机的FLASH_MODE,那么同样需要调用bindToLifecycle()方法。

这种方法的缺点是,在一两秒钟内,预览会被删除并重新附加,这并不像一个应用程序的平稳过渡。

有更好的实践吗?还是有局限性?

我附上了下面的示例代码:

代码语言:javascript
运行
复制
   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);
}

并拨动手电筒:

代码语言:javascript
运行
复制
    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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-05 17:59:37

要在创建ImageCapture实例并将其绑定到生命周期之后,在图像捕获期间启用或禁用闪存,可以使用ImageCapture.setFlashMode(boolean)

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

CameraX目前使用遮罩下的Camera2,为了更好地理解拍照时如何设置闪存模式,您可以查看模式

票数 5
EN

Stack Overflow用户

发布于 2020-12-31 04:15:26

我看到ImageCapture.flashMode只在我们使用初始配置、ImageCapture.Builder()等进行构建时才有效果。但是如果您想动态启用/禁用闪存,则必须使用以下方法。

代码语言:javascript
运行
复制
camera?.cameraControl?.enableTorch(enableFlash)

如果你想知道什么是照相机?从文档中得到的。

代码语言:javascript
运行
复制
// A variable number of use-cases can be passed here -
// camera provides access to CameraControl & CameraInfo
camera = cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62204461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档