Android如何获取相机参数?

99ANYc3cd6
预计阅读时长 31 分钟
位置: 首页 参数 正文

核心概念

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

android 获取相机参数
(图片来源网络,侵删)

使用旧版 Camera API (已废弃,仅用于旧项目维护)

这是在 Android 5.0 (Lollipop) 之前的方法,如果你的应用最低支持版本低于 API 21,并且你仍在维护旧项目,可能会用到它。

关键类: android.hardware.Camera

步骤:

  1. 获取 Camera 实例:

    android 获取相机参数
    (图片来源网络,侵删)
    // 注意:需要处理异常
    Camera camera = Camera.open(); // 默认打开后置摄像头
    // 或者 Camera camera = Camera.open(cameraId); // 打开指定ID的摄像头
  2. 获取 Parameters 对象: 一旦你有了 Camera 实例,就可以调用 getParameters() 方法来获取 Camera.Parameters 对象。

    Camera.Parameters parameters = camera.getParameters();
  3. 读取各种参数: 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);
  4. 别忘了释放: 使用完毕后,必须正确释放相机资源,否则会导致其他应用无法使用相机。

    camera.release();

使用现代 Camera2 API (推荐用于新项目)

这是目前官方推荐的标准 API,提供了更强大、更灵活的控制,但也更复杂。

android 获取相机参数
(图片来源网络,侵删)

关键类: android.hardware.camera2.CameraManager, android.hardware.camera2.CameraCharacteristics

步骤:

  1. 获取 CameraManager 实例:

    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
  2. 获取摄像头 ID 列表:

    String[] cameraIdList = manager.getCameraIdList();
    if (cameraIdList.length == 0) {
        // 没有可用的摄像头
        return;
    }
    String cameraId = cameraIdList[0]; // 使用第一个摄像头(通常是后置)
  3. 获取 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

步骤:

  1. 设置 CameraX: 首先确保你的项目已经集成了 CameraX。

  2. 获取 CameraProvider:

    ProcessCameraProvider cameraProvider = ProcessCameraProvider.getInstance(context).get();
  3. 绑定 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();
  4. 读取 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 是正确的选择。
  • 维护旧项目: 如果你的项目仍在使用旧版 Camera API,并且最低支持版本低于 API 21,那么你可以继续使用它,但应尽快规划迁移到 CameraX 或 Camera2。
-- 展开阅读全文 --
头像
ThinkPad蓝牙键盘参数有哪些?
« 上一篇 今天
10.5寸iPad Air参数有哪些?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]