You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过onClick切换Google Vision API摄像头?点击按钮修改CameraSource朝向

实现Google Vision API摄像头切换(点击按钮)

Absolutely! You can switch cameras with a button click by adjusting the CameraSource.CAMERA_FACING_* parameter—but you can’t just call setFacing() and expect it to work immediately. The CameraSource locks in its configuration when it starts, so you need to restart it after changing the facing direction. Here’s a step-by-step implementation:

核心思路

  1. 用类级变量追踪当前摄像头的朝向
  2. 按钮点击时,切换朝向(后置↔前置)
  3. 先停止当前运行的CameraSource,更新朝向设置后重新启动

代码示例

首先定义类级变量(假设你在Activity/Fragment中实现):

private CameraSource cameraSource;
private int currentCameraFacing = CameraSource.CAMERA_FACING_BACK; // 默认启用后置摄像头
private SurfaceView previewSurface; // 用于显示摄像头预览的SurfaceView
private BarcodeDetector barcodeDetector; // Google Vision的条码/二维码检测器

初始化CameraSource(首次创建)

先完成检测器和CameraSource的初始化:

// 初始化条码检测器,支持二维码和所有条码格式
barcodeDetector = new BarcodeDetector.Builder(this)
        .setBarcodeFormats(Barcode.QR_CODE | Barcode.ALL_FORMATS)
        .build();

// 初始化CameraSource,绑定检测器并设置初始参数
cameraSource = new CameraSource.Builder(this, barcodeDetector)
        .setAutoFocusEnabled(true)
        .setFacing(currentCameraFacing)
        .setRequestedPreviewSize(1280, 720)
        .build();

按钮点击切换逻辑

给切换按钮添加点击监听:

toggleCameraButton.setOnClickListener(v -> {
    // 切换摄像头朝向
    currentCameraFacing = (currentCameraFacing == CameraSource.CAMERA_FACING_BACK)
            ? CameraSource.CAMERA_FACING_FRONT
            : CameraSource.CAMERA_FACING_BACK;

    // 停止当前运行的CameraSource
    if (cameraSource != null) {
        try {
            cameraSource.stop();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 更新朝向并重启CameraSource
    try {
        cameraSource.setFacing(currentCameraFacing);
        cameraSource.start(previewSurface.getHolder());
    } catch (IOException e) {
        e.printStackTrace();
        // 处理启动失败情况:比如提示用户未授予摄像头权限,或设备无前置摄像头
    }
});

关键注意事项

  • 权限检查: 确保已经申请了CAMERA权限(Android 6.0及以上需要动态申请),没有权限摄像头无法启动。
  • 资源清理: 在Activity/Fragment的生命周期方法中停止并释放CameraSource,避免内存泄漏:
    @Override
    protected void onPause() {
        super.onPause();
        if (cameraSource != null) {
            cameraSource.stop();
        }
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (cameraSource != null) {
            cameraSource.release();
        }
        if (barcodeDetector != null) {
            barcodeDetector.release();
        }
    }
    
  • 异常处理: start()方法可能抛出IOException(比如摄像头被占用、设备无前置摄像头),一定要捕获并给用户合理提示。

内容的提问来源于stack exchange,提问作者vlasentiy

火山引擎 最新活动