如何在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
相关产品推荐
相关产品推荐

