You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android Studio中以编程方式调用广角摄像头?

调用Android广角摄像头(CameraX实现)

你当前使用的是CameraX框架,要切换到广角(超广角)摄像头,需要通过摄像头的焦距特性来筛选——因为CameraX没有直接提供广角镜头的枚举常量,超广角镜头的焦距通常是设备所有后置摄像头中最小的那个(比如主摄像头焦距约24mm等效,超广角约16mm等效)。

以下是具体的修改方案:

修改CameraSelector筛选逻辑

替换你startCameraX方法中的CameraSelector构建代码,改为筛选焦距最小的后置摄像头:

private void startCameraX(ProcessCameraProvider cameraProvider) {
    cameraProvider.unbindAll();

    // 1. 先获取所有可用的后置摄像头
    List<CameraInfo> backCameras = cameraProvider.getAvailableCameraInfos().stream()
            .filter(info -> info.getLensFacing() == CameraSelector.LENS_FACING_BACK)
            .collect(Collectors.toList());

    CameraSelector cameraSelector;
    if (!backCameras.isEmpty()) {
        // 2. 找到焦距最小的后置摄像头(即超广角/广角镜头)
        CameraInfo wideAngleCamera = backCameras.stream()
                .min(Comparator.comparingDouble(info -> {
                    // 获取摄像头的可用焦距数组,取最小的那个值
                    float[] focalLengths = info.getCameraCharacteristics().get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
                    return focalLengths != null && focalLengths.length > 0 ? focalLengths[0] : Float.MAX_VALUE;
                }))
                .orElse(null);

        if (wideAngleCamera != null) {
            // 3. 使用找到的广角摄像头构建Selector
            cameraSelector = new CameraSelector.Builder()
                    .addCameraFilter(cameraInfo -> cameraInfo.equals(wideAngleCamera))
                    .build();
        } else {
            // fallback到默认后置主摄像头
            cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;
        }
    } else {
        cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;
    }

    // Preview use case
    Preview preview = new Preview.Builder().build();
    preview.setSurfaceProvider(previewView.getSurfaceProvider());
    // Image capture use case
    imageCapture = new ImageCapture.Builder()
            .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
            .build();
    cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, preview, imageCapture);
}

代码说明

  • 首先筛选出所有后置摄像头,避免误选前置镜头
  • 通过CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS获取每个摄像头的可用焦距数组,取第一个值(通常是最小焦距)进行比较,最小的就是广角/超广角镜头
  • 添加兼容性处理:如果找不到广角镜头,自动 fallback 到默认后置主摄像头,避免崩溃

验证方法

你可以在代码中添加日志,打印每个后置摄像头的焦距,确认筛选是否正确:

for (CameraInfo info : backCameras) {
    float[] focalLengths = info.getCameraCharacteristics().get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
    Log.d(TAG, "摄像头ID: " + info.getCameraId() + " 焦距: " + Arrays.toString(focalLengths));
}

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:06:19