diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index 1a0b87e3c29d..dda28f0c96b4 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.10.2+2 + +* Fixes zoom computation for virtual cameras hiding physical cameras in Android 11+. +* Removes the unused CameraZoom class from the codebase. + ## 0.10.2+1 * Updates code for stricter lint checks. diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraProperties.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraProperties.java index 95efebbf6488..a69bae43ee17 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraProperties.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraProperties.java @@ -150,10 +150,34 @@ public interface CameraProperties { * android.hardware.camera2.CameraCharacteristics#SCALER_AVAILABLE_MAX_DIGITAL_ZOOM key. * * @return Float Maximum ratio between both active area width and crop region width, and active - * area height and crop region height + * area height and crop region height. */ Float getScalerAvailableMaxDigitalZoom(); + /** + * Returns the minimum ratio between the default camera zoom setting and all of the available + * zoom. + * + *
By default maps to the @see + * android.hardware.camera2.CameraCharacteristics#CONTROL_ZOOM_RATIO_RANGE key's lower value. + * + * @return Float Minimum ratio between the default zoom ratio and the minimum possible zoom. + */ + @RequiresApi(api = VERSION_CODES.R) + Float getScalerMinZoomRatio(); + + /** + * Returns the maximum ratio between the default camera zoom setting and all of the available + * zoom. + * + *
By default maps to the @see
+ * android.hardware.camera2.CameraCharacteristics#CONTROL_ZOOM_RATIO_RANGE key's upper value.
+ *
+ * @return Float Maximum ratio between the default zoom ratio and the maximum possible zoom.
+ */
+ @RequiresApi(api = VERSION_CODES.R)
+ Float getScalerMaxZoomRatio();
+
/**
* Returns the area of the image sensor which corresponds to active pixels after any geometric
* distortion correction has been applied.
@@ -315,6 +339,18 @@ public Float getScalerAvailableMaxDigitalZoom() {
return cameraCharacteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
}
+ @RequiresApi(api = VERSION_CODES.R)
+ @Override
+ public Float getScalerMaxZoomRatio() {
+ return cameraCharacteristics.get(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE).getUpper();
+ }
+
+ @RequiresApi(api = VERSION_CODES.R)
+ @Override
+ public Float getScalerMinZoomRatio() {
+ return cameraCharacteristics.get(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE).getLower();
+ }
+
@Override
public Rect getSensorInfoActiveArraySize() {
return cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraZoom.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraZoom.java
deleted file mode 100644
index 42ad6d76dcfc..000000000000
--- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/CameraZoom.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package io.flutter.plugins.camera;
-
-import android.graphics.Rect;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.core.math.MathUtils;
-
-public final class CameraZoom {
- public static final float DEFAULT_ZOOM_FACTOR = 1.0f;
-
- @NonNull private final Rect cropRegion = new Rect();
- @Nullable private final Rect sensorSize;
-
- public final float maxZoom;
- public final boolean hasSupport;
-
- public CameraZoom(@Nullable final Rect sensorArraySize, final Float maxZoom) {
- this.sensorSize = sensorArraySize;
-
- if (this.sensorSize == null) {
- this.maxZoom = DEFAULT_ZOOM_FACTOR;
- this.hasSupport = false;
- return;
- }
-
- this.maxZoom =
- ((maxZoom == null) || (maxZoom < DEFAULT_ZOOM_FACTOR)) ? DEFAULT_ZOOM_FACTOR : maxZoom;
-
- this.hasSupport = (Float.compare(this.maxZoom, DEFAULT_ZOOM_FACTOR) > 0);
- }
-
- public Rect computeZoom(final float zoom) {
- if (sensorSize == null || !this.hasSupport) {
- return null;
- }
-
- final float newZoom = MathUtils.clamp(zoom, DEFAULT_ZOOM_FACTOR, this.maxZoom);
-
- final int centerX = this.sensorSize.width() / 2;
- final int centerY = this.sensorSize.height() / 2;
- final int deltaX = (int) ((0.5f * this.sensorSize.width()) / newZoom);
- final int deltaY = (int) ((0.5f * this.sensorSize.height()) / newZoom);
-
- this.cropRegion.set(centerX - deltaX, centerY - deltaY, centerX + deltaX, centerY + deltaY);
-
- return cropRegion;
- }
-}
diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevelFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevelFeature.java
index 736fad4d92dc..2ac70822eb77 100644
--- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevelFeature.java
+++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevelFeature.java
@@ -6,16 +6,18 @@
import android.graphics.Rect;
import android.hardware.camera2.CaptureRequest;
+import android.os.Build;
import io.flutter.plugins.camera.CameraProperties;
import io.flutter.plugins.camera.features.CameraFeature;
/** Controls the zoom configuration on the {@link android.hardware.camera2} API. */
public class ZoomLevelFeature extends CameraFeature The returned image sensor area can be applied to the {@link android.hardware.camera2} API in
- * order to control zoom levels.
+ * order to control zoom levels. This method of zoom should only be used for Android versions <=
+ * 11 as past that, the newer {@link #computeZoomRatio()} functional can be used.
*
* @param zoom The desired zoom level.
* @param sensorArraySize The current area of the image sensor.
@@ -26,9 +27,9 @@ final class ZoomUtils {
* @param maximumZoomLevel The maximim supported zoom level.
* @return An image sensor area based on the supplied zoom settings
*/
- static Rect computeZoom(
+ static Rect computeZoomRect(
float zoom, @NonNull Rect sensorArraySize, float minimumZoomLevel, float maximumZoomLevel) {
- final float newZoom = MathUtils.clamp(zoom, minimumZoomLevel, maximumZoomLevel);
+ final float newZoom = computeZoomRatio(zoom, minimumZoomLevel, maximumZoomLevel);
final int centerX = sensorArraySize.width() / 2;
final int centerY = sensorArraySize.height() / 2;
@@ -37,4 +38,8 @@ static Rect computeZoom(
return new Rect(centerX - deltaX, centerY - deltaY, centerX + deltaX, centerY + deltaY);
}
+
+ static Float computeZoomRatio(float zoom, float minimumZoomLevel, float maximumZoomLevel) {
+ return MathUtils.clamp(zoom, minimumZoomLevel, maximumZoomLevel);
+ }
}
diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPropertiesImplTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPropertiesImplTest.java
index 40db12ee0fc3..c61be04465ab 100644
--- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPropertiesImplTest.java
+++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraPropertiesImplTest.java
@@ -201,6 +201,30 @@ public void getScalerAvailableMaxDigitalZoomTest() {
assertEquals(actualDigitalZoom, expectedDigitalZoom);
}
+ @Test
+ public void getScalerGetScalerMinZoomRatioTest() {
+ Range zoomRange = mock(Range.class);
+ when(mockCharacteristics.get(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE))
+ .thenReturn(zoomRange);
+
+ Float minZoom = cameraProperties.getScalerMinZoomRatio();
+
+ verify(mockCharacteristics, times(1)).get(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE);
+ assertEquals(zoomRange.getLower(), minZoom);
+ }
+
+ @Test
+ public void getScalerGetScalerMaxZoomRatioTest() {
+ Range zoomRange = mock(Range.class);
+ when(mockCharacteristics.get(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE))
+ .thenReturn(zoomRange);
+
+ Float maxZoom = cameraProperties.getScalerMaxZoomRatio();
+
+ verify(mockCharacteristics, times(1)).get(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE);
+ assertEquals(zoomRange.getUpper(), maxZoom);
+ }
+
@Test
public void getSensorInfoActiveArraySizeTest() {
Rect expectedArraySize = mock(Rect.class);
diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraZoomTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraZoomTest.java
deleted file mode 100644
index d3e495551608..000000000000
--- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraZoomTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package io.flutter.plugins.camera;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import android.graphics.Rect;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-
-@RunWith(RobolectricTestRunner.class)
-public class CameraZoomTest {
-
- @Test
- public void ctor_whenParametersAreValid() {
- final Rect sensorSize = new Rect(0, 0, 0, 0);
- final Float maxZoom = 4.0f;
- final CameraZoom cameraZoom = new CameraZoom(sensorSize, maxZoom);
-
- assertNotNull(cameraZoom);
- assertTrue(cameraZoom.hasSupport);
- assertEquals(4.0f, cameraZoom.maxZoom, 0);
- assertEquals(1.0f, CameraZoom.DEFAULT_ZOOM_FACTOR, 0);
- }
-
- @Test
- public void ctor_whenSensorSizeIsNull() {
- final Rect sensorSize = null;
- final Float maxZoom = 4.0f;
- final CameraZoom cameraZoom = new CameraZoom(sensorSize, maxZoom);
-
- assertNotNull(cameraZoom);
- assertFalse(cameraZoom.hasSupport);
- assertEquals(cameraZoom.maxZoom, 1.0f, 0);
- }
-
- @Test
- public void ctor_whenMaxZoomIsNull() {
- final Rect sensorSize = new Rect(0, 0, 0, 0);
- final Float maxZoom = null;
- final CameraZoom cameraZoom = new CameraZoom(sensorSize, maxZoom);
-
- assertNotNull(cameraZoom);
- assertFalse(cameraZoom.hasSupport);
- assertEquals(cameraZoom.maxZoom, 1.0f, 0);
- }
-
- @Test
- public void ctor_whenMaxZoomIsSmallerThenDefaultZoomFactor() {
- final Rect sensorSize = new Rect(0, 0, 0, 0);
- final Float maxZoom = 0.5f;
- final CameraZoom cameraZoom = new CameraZoom(sensorSize, maxZoom);
-
- assertNotNull(cameraZoom);
- assertFalse(cameraZoom.hasSupport);
- assertEquals(cameraZoom.maxZoom, 1.0f, 0);
- }
-
- @Test
- public void setZoom_whenNoSupportShouldNotSetScalerCropRegion() {
- final CameraZoom cameraZoom = new CameraZoom(null, null);
- final Rect computedZoom = cameraZoom.computeZoom(2f);
-
- assertNull(computedZoom);
- }
-
- @Test
- public void setZoom_whenSensorSizeEqualsZeroShouldReturnCropRegionOfZero() {
- final Rect sensorSize = new Rect(0, 0, 0, 0);
- final CameraZoom cameraZoom = new CameraZoom(sensorSize, 20f);
- final Rect computedZoom = cameraZoom.computeZoom(18f);
-
- assertNotNull(computedZoom);
- assertEquals(computedZoom.left, 0);
- assertEquals(computedZoom.top, 0);
- assertEquals(computedZoom.right, 0);
- assertEquals(computedZoom.bottom, 0);
- }
-
- @Test
- public void setZoom_whenSensorSizeIsValidShouldReturnCropRegion() {
- final Rect sensorSize = new Rect(0, 0, 100, 100);
- final CameraZoom cameraZoom = new CameraZoom(sensorSize, 20f);
- final Rect computedZoom = cameraZoom.computeZoom(18f);
-
- assertNotNull(computedZoom);
- assertEquals(computedZoom.left, 48);
- assertEquals(computedZoom.top, 48);
- assertEquals(computedZoom.right, 52);
- assertEquals(computedZoom.bottom, 52);
- }
-
- @Test
- public void setZoom_whenZoomIsGreaterThenMaxZoomClampToMaxZoom() {
- final Rect sensorSize = new Rect(0, 0, 100, 100);
- final CameraZoom cameraZoom = new CameraZoom(sensorSize, 10f);
- final Rect computedZoom = cameraZoom.computeZoom(25f);
-
- assertNotNull(computedZoom);
- assertEquals(computedZoom.left, 45);
- assertEquals(computedZoom.top, 45);
- assertEquals(computedZoom.right, 55);
- assertEquals(computedZoom.bottom, 55);
- }
-
- @Test
- public void setZoom_whenZoomIsSmallerThenMinZoomClampToMinZoom() {
- final Rect sensorSize = new Rect(0, 0, 100, 100);
- final CameraZoom cameraZoom = new CameraZoom(sensorSize, 10f);
- final Rect computedZoom = cameraZoom.computeZoom(0.5f);
-
- assertNotNull(computedZoom);
- assertEquals(computedZoom.left, 0);
- assertEquals(computedZoom.top, 0);
- assertEquals(computedZoom.right, 100);
- assertEquals(computedZoom.bottom, 100);
- }
-}
diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevelFeatureTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevelFeatureTest.java
index 9f05cc255a8b..4d5826967009 100644
--- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevelFeatureTest.java
+++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/zoomlevel/ZoomLevelFeatureTest.java
@@ -18,7 +18,10 @@
import android.graphics.Rect;
import android.hardware.camera2.CaptureRequest;
+import android.os.Build;
import io.flutter.plugins.camera.CameraProperties;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -40,7 +43,7 @@ public void before() {
mockSensorArray = mock(Rect.class);
mockedStaticCameraZoom
- .when(() -> ZoomUtils.computeZoom(anyFloat(), any(), anyFloat(), anyFloat()))
+ .when(() -> ZoomUtils.computeZoomRect(anyFloat(), any(), anyFloat(), anyFloat()))
.thenReturn(mockZoomArea);
}
@@ -147,6 +150,22 @@ public void updateBuilder_shouldSetScalarCropRegionWhenCheckIsSupportIsTrue() {
verify(mockBuilder, times(1)).set(CaptureRequest.SCALER_CROP_REGION, mockZoomArea);
}
+ @Test
+ public void updateBuilder_shouldControlZoomRatioWhenCheckIsSupportIsTrue() throws Exception {
+ setSdkVersion(Build.VERSION_CODES.R);
+ when(mockCameraProperties.getSensorInfoActiveArraySize()).thenReturn(mockSensorArray);
+ when(mockCameraProperties.getScalerMaxZoomRatio()).thenReturn(42f);
+ when(mockCameraProperties.getScalerMinZoomRatio()).thenReturn(1.0f);
+
+ ZoomLevelFeature zoomLevelFeature = new ZoomLevelFeature(mockCameraProperties);
+
+ CaptureRequest.Builder mockBuilder = mock(CaptureRequest.Builder.class);
+
+ zoomLevelFeature.updateBuilder(mockBuilder);
+
+ verify(mockBuilder, times(1)).set(CaptureRequest.CONTROL_ZOOM_RATIO, 0.0f);
+ }
+
@Test
public void getMinimumZoomLevel() {
ZoomLevelFeature zoomLevelFeature = new ZoomLevelFeature(mockCameraProperties);
@@ -163,4 +182,38 @@ public void getMaximumZoomLevel() {
assertEquals(42f, zoomLevelFeature.getMaximumZoomLevel(), 0);
}
+
+ @Test
+ public void checkZoomLevelFeature_callsMaxDigitalZoomOnAndroidQ() throws Exception {
+ setSdkVersion(Build.VERSION_CODES.Q);
+
+ when(mockCameraProperties.getSensorInfoActiveArraySize()).thenReturn(mockSensorArray);
+
+ new ZoomLevelFeature(mockCameraProperties);
+
+ verify(mockCameraProperties, times(0)).getScalerMaxZoomRatio();
+ verify(mockCameraProperties, times(0)).getScalerMinZoomRatio();
+ verify(mockCameraProperties, times(1)).getScalerAvailableMaxDigitalZoom();
+ }
+
+ @Test
+ public void checkZoomLevelFeature_callsScalarMaxZoomRatioOnAndroidR() throws Exception {
+ setSdkVersion(Build.VERSION_CODES.R);
+ when(mockCameraProperties.getSensorInfoActiveArraySize()).thenReturn(mockSensorArray);
+
+ new ZoomLevelFeature(mockCameraProperties);
+
+ verify(mockCameraProperties, times(1)).getScalerMaxZoomRatio();
+ verify(mockCameraProperties, times(1)).getScalerMinZoomRatio();
+ verify(mockCameraProperties, times(0)).getScalerAvailableMaxDigitalZoom();
+ }
+
+ static void setSdkVersion(int sdkVersion) throws Exception {
+ Field sdkInt = Build.VERSION.class.getField("SDK_INT");
+ sdkInt.setAccessible(true);
+ Field modifiersField = Field.class.getDeclaredField("modifiers");
+ modifiersField.setAccessible(true);
+ modifiersField.setInt(sdkInt, sdkInt.getModifiers() & ~Modifier.FINAL);
+ sdkInt.set(null, sdkVersion);
+ }
}
diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/zoomlevel/ZoomUtilsTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/zoomlevel/ZoomUtilsTest.java
index 28160ff30714..2f6160816d15 100644
--- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/zoomlevel/ZoomUtilsTest.java
+++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/zoomlevel/ZoomUtilsTest.java
@@ -15,9 +15,9 @@
@RunWith(RobolectricTestRunner.class)
public class ZoomUtilsTest {
@Test
- public void setZoom_whenSensorSizeEqualsZeroShouldReturnCropRegionOfZero() {
+ public void setZoomRect_whenSensorSizeEqualsZeroShouldReturnCropRegionOfZero() {
final Rect sensorSize = new Rect(0, 0, 0, 0);
- final Rect computedZoom = ZoomUtils.computeZoom(18f, sensorSize, 1f, 20f);
+ final Rect computedZoom = ZoomUtils.computeZoomRect(18f, sensorSize, 1f, 20f);
assertNotNull(computedZoom);
assertEquals(computedZoom.left, 0);
@@ -27,9 +27,9 @@ public void setZoom_whenSensorSizeEqualsZeroShouldReturnCropRegionOfZero() {
}
@Test
- public void setZoom_whenSensorSizeIsValidShouldReturnCropRegion() {
+ public void setZoomRect_whenSensorSizeIsValidShouldReturnCropRegion() {
final Rect sensorSize = new Rect(0, 0, 100, 100);
- final Rect computedZoom = ZoomUtils.computeZoom(18f, sensorSize, 1f, 20f);
+ final Rect computedZoom = ZoomUtils.computeZoomRect(18f, sensorSize, 1f, 20f);
assertNotNull(computedZoom);
assertEquals(computedZoom.left, 48);
@@ -39,9 +39,9 @@ public void setZoom_whenSensorSizeIsValidShouldReturnCropRegion() {
}
@Test
- public void setZoom_whenZoomIsGreaterThenMaxZoomClampToMaxZoom() {
+ public void setZoomRect_whenZoomIsGreaterThenMaxZoomClampToMaxZoom() {
final Rect sensorSize = new Rect(0, 0, 100, 100);
- final Rect computedZoom = ZoomUtils.computeZoom(25f, sensorSize, 1f, 10f);
+ final Rect computedZoom = ZoomUtils.computeZoomRect(25f, sensorSize, 1f, 10f);
assertNotNull(computedZoom);
assertEquals(computedZoom.left, 45);
@@ -51,9 +51,9 @@ public void setZoom_whenZoomIsGreaterThenMaxZoomClampToMaxZoom() {
}
@Test
- public void setZoom_whenZoomIsSmallerThenMinZoomClampToMinZoom() {
+ public void setZoomRect_whenZoomIsSmallerThenMinZoomClampToMinZoom() {
final Rect sensorSize = new Rect(0, 0, 100, 100);
- final Rect computedZoom = ZoomUtils.computeZoom(0.5f, sensorSize, 1f, 10f);
+ final Rect computedZoom = ZoomUtils.computeZoomRect(0.5f, sensorSize, 1f, 10f);
assertNotNull(computedZoom);
assertEquals(computedZoom.left, 0);
@@ -61,4 +61,25 @@ public void setZoom_whenZoomIsSmallerThenMinZoomClampToMinZoom() {
assertEquals(computedZoom.right, 100);
assertEquals(computedZoom.bottom, 100);
}
+
+ @Test
+ public void setZoomRatio_whenNewZoomGreaterThanMaxZoomClampToMaxZoom() {
+ final Float computedZoom = ZoomUtils.computeZoomRatio(21f, 1f, 20f);
+ assertNotNull(computedZoom);
+ assertEquals(computedZoom, 20f, 0.0f);
+ }
+
+ @Test
+ public void setZoomRatio_whenNewZoomLesserThanMinZoomClampToMinZoom() {
+ final Float computedZoom = ZoomUtils.computeZoomRatio(0.7f, 1f, 20f);
+ assertNotNull(computedZoom);
+ assertEquals(computedZoom, 1f, 0.0f);
+ }
+
+ @Test
+ public void setZoomRatio_whenNewZoomValidReturnNewZoom() {
+ final Float computedZoom = ZoomUtils.computeZoomRatio(2.0f, 1f, 20f);
+ assertNotNull(computedZoom);
+ assertEquals(computedZoom, 2.0f, 0.0f);
+ }
}
diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml
index 9d86a00e0e50..20a86ad36c19 100644
--- a/packages/camera/camera_android/pubspec.yaml
+++ b/packages/camera/camera_android/pubspec.yaml
@@ -2,7 +2,7 @@ name: camera_android
description: Android implementation of the camera plugin.
repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_android
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
-version: 0.10.2+1
+version: 0.10.2+2
environment:
sdk: ">=2.14.0 <3.0.0"