求助:CameraCharacteristics SENSOR_INFO_EXPOSURE_TIME_RANGE返回错误值
我之前在处理Android相机适配时也碰到过华为机型上Camera2 API参数返回不符的情况,针对你说的P30 Pro的问题,给你几个实用的解决思路:
确认相机设备的ID与活跃状态
首先要确保你调用API时使用的是正确的相机ID(比如P30 Pro的后置主摄通常对应ID为0),副摄的曝光范围普遍会窄很多。另外,一定要在相机设备打开并创建CaptureSession之后再查询参数——部分硬件参数只有在相机处于活跃状态时才会返回真实可用的范围,提前查询可能得到的是默认的理论值。结合帧率范围推导实际最大曝光时间
曝光时间和帧率是强关联的:单帧最长曝光时间不能超过当前帧率的倒数(比如1/30fps对应的最长曝光就是30s)。你可以先获取设备支持的帧率范围,再推导最大曝光时间:// 获取相机特性 CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); // 获取支持的帧率范围数组 Range<Integer>[] fpsRanges = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES); // 找到支持的最低帧率(比如[1,30],最低帧率是1) int minFps = Integer.MAX_VALUE; for (Range<Integer> range : fpsRanges) { minFps = Math.min(minFps, range.getLower()); } // 计算理论最大曝光时间(单位:纳秒,1秒=1e9纳秒) long maxExposureTime = 1_000_000_000L / minFps;得到这个值后,你可以手动设置曝光时间来验证是否可用。
尝试查询华为自定义扩展参数
华为部分机型会通过自定义参数暴露更准确的硬件能力,你可以尝试通过CameraCharacteristics.get()查询厂商扩展的键值,比如:// 尝试获取华为自定义的最大曝光时间参数 Long customMaxExposure = characteristics.get(new Key<Long>("android.sensor.exposure.time.max") {}); if (customMaxExposure != null) { // 使用这个值作为参考 }注意:这类自定义参数没有官方文档,不同机型可能有差异,需要测试验证。
手动枚举验证可用曝光值
如果以上方法都无法得到准确范围,一个兜底方案是手动尝试设置不同的曝光时间(从API返回的最大值开始,逐步增大到30s对应的30_000_000_000L纳秒),通过提交CaptureRequest并检查是否能成功捕获帧来确定实际支持的范围:CaptureRequest.Builder requestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF); // 测试30s曝光时间 long testExposure = 30_000_000_000L; requestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, testExposure); // 提交请求并监听结果 cameraCaptureSession.setRepeatingRequest(requestBuilder.build(), new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { // 检查实际应用的曝光时间是否与设置值一致 long actualExposure = result.get(CaptureResult.SENSOR_EXPOSURE_TIME); if (actualExposure == testExposure) { // 该曝光时间可用 } } }, null);
补充说明:
SENSOR_INFO_EXPOSURE_TIME_RANGE返回的是传感器硬件的理论上限,但系统相机的专业模式可能通过软件优化(比如长曝光算法、多帧合成)实现了更长的曝光时间,所以API返回的范围和实际可用范围会有差异,需要结合实际使用场景验证。
内容的提问来源于stack exchange,提问作者Shivam Pokhriyal

