核心概念
无论使用哪种 API,获取相机参数的本质都是通过一个 Camera 或 CameraDevice 对象来访问一个 Parameters 或 CameraCharacteristics 对象,这个对象包含了相机硬件和软件支持的所有配置信息。

使用旧版 Camera API (已废弃,仅用于旧项目维护)
这是在 Android 5.0 (Lollipop) 之前的方法,如果你的应用最低支持版本低于 API 21,并且你仍在维护旧项目,可能会用到它。
关键类: android.hardware.Camera
步骤:
-
获取 Camera 实例:
(图片来源网络,侵删)// 注意:需要处理异常 Camera camera = Camera.open(); // 默认打开后置摄像头 // 或者 Camera camera = Camera.open(cameraId); // 打开指定ID的摄像头
-
获取 Parameters 对象: 一旦你有了
Camera实例,就可以调用getParameters()方法来获取Camera.Parameters对象。Camera.Parameters parameters = camera.getParameters();
-
读取各种参数:
Camera.Parameters对象提供了大量的 getter 方法来查询具体的参数。// --- 示例:获取支持的参数 --- // 1. 获取支持的预览尺寸列表 List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); for (Camera.Size size : previewSizes) { Log.d("CameraAPI", "Preview Size: " + size.width + "x" + size.height); } // 2. 获取支持的图片拍摄尺寸列表 List<Camera.Size> pictureSizes = parameters.getSupportedPictureSizes(); for (Camera.Size size : pictureSizes) { Log.d("CameraAPI", "Picture Size: " + size.width + "x" + size.height); } // 3. 获取支持的对焦模式列表 List<String> focusModes = parameters.getSupportedFocusModes(); Log.d("CameraAPI", "Supported Focus Modes: " + focusModes); // 4. 获取当前闪光灯模式 String flashMode = parameters.getFlashMode(); Log.d("CameraAPI", "Current Flash Mode: " + flashMode); // 5. 获取支持的闪光灯模式列表 List<String> supportedFlashModes = parameters.getSupportedFlashModes(); Log.d("CameraAPI", "Supported Flash Modes: " + supportedFlashModes); // 6. 获取当前的白平衡模式 String whiteBalance = parameters.getWhiteBalance(); Log.d("CameraAPI", "Current White Balance: " + whiteBalance); // 7. 获取支持的场景模式列表 List<String> sceneModes = parameters.getSupportedSceneModes(); Log.d("CameraAPI", "Supported Scene Modes: " + sceneModes); -
别忘了释放: 使用完毕后,必须正确释放相机资源,否则会导致其他应用无法使用相机。
camera.release();
使用现代 Camera2 API (推荐用于新项目)
这是目前官方推荐的标准 API,提供了更强大、更灵活的控制,但也更复杂。

关键类: android.hardware.camera2.CameraManager, android.hardware.camera2.CameraCharacteristics
步骤:
-
获取 CameraManager 实例:
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
-
获取摄像头 ID 列表:
String[] cameraIdList = manager.getCameraIdList(); if (cameraIdList.length == 0) { // 没有可用的摄像头 return; } String cameraId = cameraIdList[0]; // 使用第一个摄像头(通常是后置) -
获取 CameraCharacteristics 对象:
CameraCharacteristics是获取所有相机参数的核心对象,它包含了硬件的静态属性(如传感器信息、支持的尺寸、支持的特效等)。// 注意:需要在 try-catch 块中调用,因为它会抛出 CameraAccessException try { CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); // --- 示例:获取各种参数 --- // 1. 获取传感器方向(用于计算图片旋转角度) int sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); Log.d("Camera2API", "Sensor Orientation: " + sensorOrientation + " degrees"); // 2. 获取支持的硬件级别(FULL, LEVEL3) int hardwareLevel = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL); Log.d("Camera2API", "Hardware Level: " + hardwareLevel); // 3. 获取所有支持的可配置流配置(尺寸+格式) StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); if (map != null) { // 3.1 获取支持的预览尺寸 android.util.Size[] previewSizes = map.getOutputSizes(SurfaceTexture.class); for (android.util.Size size : previewSizes) { Log.d("Camera2API", "Preview Size: " + size.getWidth() + "x" + size.getHeight()); } // 3.2 获取支持的图片尺寸 android.util.Size[] pictureSizes = map.getOutputSizes(ImageFormat.JPEG); for (android.util.Size size : pictureSizes) { Log.d("Camera2API", "Picture Size: " + size.getWidth() + "x" + size.getHeight()); } // 3.3 获取支持的视频尺寸 android.util.Size[] videoSizes = map.getOutputSizes(MediaRecorder.class); for (android.util.Size size : videoSizes) { Log.d("Camera2API", "Video Size: " + size.getWidth() + "x" + size.getHeight()); } } // 4. 检查是否支持自动对焦 boolean[] supportedFocusModes = characteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES); List<String> focusModesList = new ArrayList<>(); if (supportedFocusModes != null) { for (int mode : supportedFocusModes) { focusModesList.add("CONTROL_AF_MODE_" + mode); } } Log.d("Camera2API", "Supported Focus Modes: " + focusModesList); // 5. 检查是否支持闪光灯 Boolean flashAvailable = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); Log.d("Camera2API", "Flash Available: " + flashAvailable); // 6. 检查是否支持特定特效 int[] availableEffects = characteristics.get(CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS); List<String> effectsList = new ArrayList<>(); if (availableEffects != null) { for (int effect : availableEffects) { effectsList.add("CONTROL_EFFECT_" + effect); } } Log.d("Camera2API", "Available Effects: " + effectsList); } catch (CameraAccessException e) { e.printStackTrace(); }
使用 CameraX (简化 Camera2 API)
CameraX 是一个 Jetpack 库,它在 Camera2 API 之上提供了一个更简洁、兼容性更好的 API,如果你不想处理 Camera2 的复杂性,CameraX 是最佳选择。
关键类: androidx.camera.core.CameraSelector, androidx.camera.core.CameraInfo
步骤:
-
设置 CameraX: 首先确保你的项目已经集成了 CameraX。
-
获取 CameraProvider:
ProcessCameraProvider cameraProvider = ProcessCameraProvider.getInstance(context).get();
-
绑定 Camera 并获取 CameraInfo:
CameraInfo对象包含了与特定相机实例相关的所有信息。CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA; // 使用 CameraX 的 Preview 用例来获取相机实例 Preview preview = new Preview.Builder().build(); cameraProvider.unbindAll(); // 解除所有绑定 Camera camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview); // 获取 CameraInfo CameraInfo cameraInfo = camera.getCameraInfo();
-
读取 CameraInfo 中的参数:
CameraInfo的方法非常直观。// --- 示例:获取各种参数 --- // 1. 获取传感器方向 int sensorRotation = cameraInfo.getSensorRotationDegrees(); Log.d("CameraX", "Sensor Rotation: " + sensorRotation + " degrees"); // 2. 获取镜头朝向 LensFacing lensFacing = cameraInfo.getLensFacing(); Log.d("CameraX", "Lens Facing: " + (lensFacing == LensFacing.FRONT ? "FRONT" : "BACK")); // 3. 获取支持的焦距范围 float[] focalLengths = cameraInfo.getCameraCharacteristic(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS); if (focalLengths != null) { Log.d("CameraX", "Available Focal Lengths: " + Arrays.toString(focalLengths)); } // 4. 获取支持的闪光灯模式 Set<FlashMode> supportedFlashModes = cameraInfo.getSupportedFlashModes(); Log.d("CameraX", "Supported Flash Modes: " + supportedFlashModes); // 5. 获取支持的拍摄模式(如单拍、连拍等) Set<Effect> supportedEffects = cameraInfo.getSupportedEffects(); Log.d("CameraX", "Supported Effects: " + supportedEffects); // 6. 获取特定的 CameraCharacteristics // CameraX 内部也封装了对 CameraCharacteristics 的访问 CameraCharacteristics characteristics = cameraInfo.getCameraCharacteristic(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE); if (characteristics != null) { Log.d("CameraX", "Sensor Physical Size: " + characteristics); }
总结与对比
| 特性 | 旧版 Camera API | Camera2 API | CameraX |
|---|---|---|---|
| API 级别 | API 1 - 21 (已废弃) | API 21+ (推荐) | 依赖 Camera2 (API 21+) |
| 易用性 | 简单 | 复杂 | 非常简单 |
| 功能 | 基础功能 | 强大、全面 | 强大,但由 CameraX 封装 |
| 控制粒度 | 粗粒度 | 细粒度 | 中等粒度 |
| 推荐用途 | 维护旧项目 | 新项目,需要高级功能 | 新项目,追求开发效率 |
| 核心参数类 | Camera.Parameters |
CameraCharacteristics |
CameraInfo |
最佳实践建议
- 对于新项目: 强烈推荐使用 CameraX,它能让你用最少的代码实现强大的相机功能,并且自动处理了设备兼容性问题,如果你需要 Camera2 中 CameraX 未直接暴露的底层参数,可以通过
CameraInfo.getCameraCharacteristic()方法访问。 - 对于需要极致性能或特殊功能的项目: CameraX 无法满足你的需求(非常复杂的自定义处理),那么直接使用 Camera2 API 是正确的选择。
- 维护旧项目: 如果你的项目仍在使用旧版
CameraAPI,并且最低支持版本低于 API 21,那么你可以继续使用它,但应尽快规划迁移到 CameraX 或 Camera2。
