Android中使用CameraX API调用WiFi/蓝牙外接摄像头及构建CameraSelector方法
构建适配外接WiFi/蓝牙摄像头的CameraSelector实例
CameraX 依赖 Android Camera2 API,只要外接摄像头适配了Camera2兼容层,就能被CameraX识别。构建CameraSelector的核心是精准筛选出外接摄像头设备,具体实现如下:
1. 通用外接摄像头筛选逻辑
通过自定义CameraFilter区分内置与外接摄像头,兼容不同厂商的外接设备标记方式:
CameraSelector cameraSelector = new CameraSelector.Builder() .addCameraFilter(cameraInfos -> { List<CameraInfo> externalCameras = new ArrayList<>(); for (CameraInfo info : cameraInfos) { CameraCharacteristics characteristics = info.getCameraCharacteristics(); // 优先识别官方标记的外接摄像头 Integer physicalType = characteristics.get(CameraCharacteristics.INFO_PHYSICAL_CAMERA_TYPE); if (physicalType != null && physicalType == CameraCharacteristics.INFO_PHYSICAL_CAMERA_TYPE_EXTERNAL) { externalCameras.add(info); continue; } // 兼容未正确标记的外接设备:排除内置前后置摄像头 Integer lensFacing = characteristics.get(CameraCharacteristics.LENS_FACING); if (lensFacing == null || (lensFacing != CameraCharacteristics.LENS_FACING_BACK && lensFacing != CameraCharacteristics.LENS_FACING_FRONT)) { externalCameras.add(info); } } return externalCameras; }) .build();
2. 指定具体外接摄像头(已知ID时)
如果已经通过CameraProvider.getAvailableCameraInfos()获取到目标外接摄像头的ID,可直接精准匹配:
CameraSelector cameraSelector = new CameraSelector.Builder() .addCameraFilter(cameraInfos -> { List<CameraInfo> targetCameras = new ArrayList<>(); for (CameraInfo info : cameraInfos) { // 替换为实际的外接摄像头ID,比如"external_0" if ("your_external_camera_id".equals(info.getCameraId())) { targetCameras.add(info); break; } } return targetCameras; }) .build();
3. 结合ImageAnalysis使用示例
构建好CameraSelector后,正常绑定ImageAnalysis用例即可实现外接摄像头图像分析:
ImageAnalysis imageAnalysis = new ImageAnalysis.Builder() .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build(); imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(context), image -> { // 在这里处理外接摄像头采集的图像数据 // 处理完成后必须调用close()释放图像资源 image.close(); }); // 绑定到生命周期 CameraProvider cameraProvider = CameraX.getCameraProvider(); cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageAnalysis);
注意事项
- 确保已申请
CAMERA权限,外接摄像头同样需要该权限 - 可通过
CameraX.getCameraProvider().listenToAvailableCameras()监听外接摄像头的连接/断开状态,动态更新CameraSelector
内容的提问来源于stack exchange,提问作者Aparna
相关产品推荐
相关产品推荐

