diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/meter/ExposureMeter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/meter/ExposureMeter.java index ed904932..5e7b4581 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/meter/ExposureMeter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/meter/ExposureMeter.java @@ -24,6 +24,9 @@ public class ExposureMeter extends BaseMeter { private static final int STATE_WAITING_PRECAPTURE = 0; private static final int STATE_WAITING_PRECAPTURE_END = 1; + private boolean mSupportsAreas = false; + private boolean mSupportsTrigger = false; + @SuppressWarnings("WeakerAccess") public ExposureMeter(@NonNull List areas, boolean skipIfPossible) { super(areas, skipIfPossible); @@ -32,9 +35,9 @@ public class ExposureMeter extends BaseMeter { @Override protected boolean checkIsSupported(@NonNull ActionHolder holder) { // In our case, this means checking if we support the AE precapture trigger. - boolean isNotLegacy = readCharacteristic( + boolean isLegacy = readCharacteristic( CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL, -1) - != CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY; + == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY; Integer aeMode = holder.getBuilder(this).get(CaptureRequest.CONTROL_AE_MODE); boolean isAEOn = aeMode != null && (aeMode == CameraCharacteristics.CONTROL_AE_MODE_ON @@ -43,8 +46,13 @@ public class ExposureMeter extends BaseMeter { || aeMode == CameraCharacteristics.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE || aeMode == 5 /* CameraCharacteristics.CONTROL_AE_MODE_ON_EXTERNAL_FLASH, API 28 */); - boolean result = isNotLegacy && isAEOn; - LOG.i("checkIsSupported:", result); + mSupportsTrigger = !isLegacy; + mSupportsAreas = readCharacteristic(CameraCharacteristics.CONTROL_MAX_REGIONS_AE, + 0) > 0; + boolean result = isAEOn && (mSupportsTrigger || mSupportsAreas); + LOG.i("checkIsSupported:", result, + "trigger:", mSupportsTrigger, + "areas:", mSupportsAreas); return result; } @@ -66,22 +74,26 @@ public class ExposureMeter extends BaseMeter { protected void onStarted(@NonNull ActionHolder holder, @NonNull List areas) { LOG.i("onStarted:", "with areas:", areas); - // Launch the precapture trigger. - holder.getBuilder(this).set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, - CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START); - - // Check the regions. - int maxRegions = readCharacteristic(CameraCharacteristics.CONTROL_MAX_REGIONS_AE, - 0); - if (!areas.isEmpty() && maxRegions > 0) { - int max = Math.min(maxRegions, areas.size()); + if (mSupportsAreas && !areas.isEmpty()) { + int max = readCharacteristic(CameraCharacteristics.CONTROL_MAX_REGIONS_AE, 0); + max = Math.min(max, areas.size()); holder.getBuilder(this).set(CaptureRequest.CONTROL_AE_REGIONS, areas.subList(0, max).toArray(new MeteringRectangle[]{})); } + if (mSupportsTrigger) { + holder.getBuilder(this).set( + CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, + CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START); + } + // Apply holder.applyBuilder(this); - setState(STATE_WAITING_PRECAPTURE); + if (mSupportsTrigger) { + setState(STATE_WAITING_PRECAPTURE); + } else { + setState(STATE_WAITING_PRECAPTURE_END); + } } @Override