diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index 686d8bc8fb6e..1e46c7c96e61 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.9+6 + +* Reverts changes to support Impeller. + ## 0.10.9+5 * Updates annotations lib to 1.8.0. diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java index 52c5e59f1815..7668ec97eec7 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/Camera.java @@ -9,6 +9,7 @@ import android.app.Activity; import android.content.Context; import android.graphics.ImageFormat; +import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraDevice; @@ -62,7 +63,7 @@ import io.flutter.plugins.camera.media.MediaRecorderBuilder; import io.flutter.plugins.camera.types.CameraCaptureProperties; import io.flutter.plugins.camera.types.CaptureTimeoutsWrapper; -import io.flutter.view.TextureRegistry; +import io.flutter.view.TextureRegistry.SurfaceTextureEntry; import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -112,7 +113,7 @@ class Camera */ @VisibleForTesting int initialCameraFacing; - @VisibleForTesting final TextureRegistry.SurfaceProducer surfaceProducer; + @VisibleForTesting final SurfaceTextureEntry flutterTexture; private final VideoCaptureSettings videoCaptureSettings; private final Context applicationContext; final DartMessenger dartMessenger; @@ -213,16 +214,17 @@ public VideoCaptureSettings(@NonNull ResolutionPreset resolutionPreset, boolean public Camera( final Activity activity, - final TextureRegistry.SurfaceProducer surfaceProducer, + final SurfaceTextureEntry flutterTexture, final CameraFeatureFactory cameraFeatureFactory, final DartMessenger dartMessenger, final CameraProperties cameraProperties, final VideoCaptureSettings videoCaptureSettings) { + if (activity == null) { throw new IllegalStateException("No activity available!"); } this.activity = activity; - this.surfaceProducer = surfaceProducer; + this.flutterTexture = flutterTexture; this.dartMessenger = dartMessenger; this.applicationContext = activity.getApplicationContext(); this.cameraProperties = cameraProperties; @@ -241,6 +243,7 @@ public Camera( if (videoCaptureSettings.fps != null && videoCaptureSettings.fps.intValue() > 0) { recordingFps = videoCaptureSettings.fps; } else { + if (SdkCapabilityChecker.supportsEncoderProfiles()) { EncoderProfiles encoderProfiles = getRecordingProfile(); if (encoderProfiles != null && encoderProfiles.getVideoProfiles().size() > 0) { @@ -253,6 +256,7 @@ public Camera( } if (recordingFps != null && recordingFps.intValue() > 0) { + final FpsRangeFeature fpsRange = new FpsRangeFeature(cameraProperties); fpsRange.setValue(new Range(recordingFps, recordingFps)); this.cameraFeatures.setFpsRange(fpsRange); @@ -303,9 +307,8 @@ private void prepareMediaRecorder(String outputFilePath) throws IOException { MediaRecorderBuilder mediaRecorderBuilder; - // TODO(camsim99): Revert changes that allow legacy code to be used when recordingProfile is - // null once this has largely been fixed on the Android side. - // https://github.com/flutter/flutter/issues/119668 + // TODO(camsim99): Revert changes that allow legacy code to be used when recordingProfile is null + // once this has largely been fixed on the Android side. https://github.com/flutter/flutter/issues/119668 if (SdkCapabilityChecker.supportsEncoderProfiles() && getRecordingProfile() != null) { mediaRecorderBuilder = new MediaRecorderBuilder( @@ -383,8 +386,7 @@ public void onOpened(@NonNull CameraDevice device) { cameraDevice = new DefaultCameraDeviceWrapper(device); try { startPreview(); - if (!recordingVideo) { // only send initialization if we werent already recording and - // switching cameras + if (!recordingVideo) { // only send initialization if we werent already recording and switching cameras dartMessenger.sendCameraInitializedEvent( resolutionFeature.getPreviewSize().getWidth(), resolutionFeature.getPreviewSize().getHeight(), @@ -468,10 +470,11 @@ private void createCaptureSession( // Build Flutter surface to render to. ResolutionFeature resolutionFeature = cameraFeatures.getResolution(); - surfaceProducer.setSize( + SurfaceTexture surfaceTexture = flutterTexture.surfaceTexture(); + surfaceTexture.setDefaultBufferSize( resolutionFeature.getPreviewSize().getWidth(), resolutionFeature.getPreviewSize().getHeight()); - Surface flutterSurface = surfaceProducer.getSurface(); + Surface flutterSurface = new Surface(surfaceTexture); previewRequestBuilder.addTarget(flutterSurface); List remainingSurfaces = Arrays.asList(surfaces); @@ -1157,8 +1160,7 @@ public void resumePreview() { } public void startPreview() throws CameraAccessException, InterruptedException { - // If recording is already in progress, the camera is being flipped, so send it through the - // VideoRenderer to keep the correct orientation. + // If recording is already in progress, the camera is being flipped, so send it through the VideoRenderer to keep the correct orientation. if (recordingVideo) { startPreviewWithVideoRendererStream(); } else { @@ -1191,6 +1193,7 @@ private void startPreviewWithVideoRendererStream() } if (cameraProperties.getLensFacing() != initialCameraFacing) { + // If the new camera is facing the opposite way than the initial recording, // the rotation should be flipped 180 degrees. rotation = (rotation + 180) % 360; @@ -1358,13 +1361,13 @@ public void uncaughtException(Thread thread, Throwable ex) { public void setDescriptionWhileRecording( @NonNull final Result result, CameraProperties properties) { + if (!recordingVideo) { result.error("setDescriptionWhileRecordingFailed", "Device was not recording", null); return; } - // See VideoRenderer.java; support for this EGL extension is required to switch camera while - // recording. + // See VideoRenderer.java; support for this EGL extension is required to switch camera while recording. if (!SdkCapabilityChecker.supportsEglRecordableAndroid()) { result.error( "setDescriptionWhileRecordingFailed", @@ -1397,7 +1400,7 @@ public void dispose() { Log.i(TAG, "dispose"); close(); - surfaceProducer.release(); + flutterTexture.release(); getDeviceOrientationManager().stop(); } diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java index b3f4da808688..eae8c650fe60 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java @@ -393,9 +393,11 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce Integer videoBitrate = call.argument("videoBitrate"); Integer audioBitrate = call.argument("audioBitrate"); - TextureRegistry.SurfaceProducer surfaceProducer = textureRegistry.createSurfaceProducer(); + TextureRegistry.SurfaceTextureEntry flutterSurfaceTexture = + textureRegistry.createSurfaceTexture(); DartMessenger dartMessenger = - new DartMessenger(messenger, surfaceProducer.id(), new Handler(Looper.getMainLooper())); + new DartMessenger( + messenger, flutterSurfaceTexture.id(), new Handler(Looper.getMainLooper())); CameraProperties cameraProperties = new CameraPropertiesImpl(cameraName, CameraUtils.getCameraManager(activity)); ResolutionPreset resolutionPreset = ResolutionPreset.valueOf(preset); @@ -403,7 +405,7 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce camera = new Camera( activity, - surfaceProducer, + flutterSurfaceTexture, new CameraFeatureFactoryImpl(), dartMessenger, cameraProperties, @@ -411,7 +413,7 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce resolutionPreset, enableAudio, fps, videoBitrate, audioBitrate)); Map reply = new HashMap<>(); - reply.put("cameraId", surfaceProducer.id()); + reply.put("cameraId", flutterSurfaceTexture.id()); result.success(reply); } diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java index 976380851cae..d2d90b7beca6 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest.java @@ -32,6 +32,7 @@ import io.flutter.plugin.common.EventChannel; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugins.camera.features.CameraFeatureFactory; +import io.flutter.plugins.camera.features.CameraFeatures; import io.flutter.plugins.camera.features.Point; import io.flutter.plugins.camera.features.autofocus.AutoFocusFeature; import io.flutter.plugins.camera.features.autofocus.FocusMode; @@ -122,6 +123,7 @@ public class CameraTest { @Before public void before() { + mockRangeConstruction = new RangeConstruction(); mockCameraProperties = mock(CameraProperties.class); mockDartMessenger = mock(DartMessenger.class); @@ -133,8 +135,8 @@ public void before() { mockHandler = mock(Handler.class); final Activity mockActivity = mock(Activity.class); - final TextureRegistry.SurfaceProducer mockSurfaceProducer = - mock(TextureRegistry.SurfaceProducer.class); + final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = + mock(TextureRegistry.SurfaceTextureEntry.class); final String cameraName = "1"; final ResolutionPreset resolutionPreset = ResolutionPreset.high; final boolean enableAudio = false; @@ -161,7 +163,7 @@ public void before() { camera = new Camera( mockActivity, - mockSurfaceProducer, + mockFlutterTexture, mockCameraFeatureFactory, mockDartMessenger, mockCameraProperties, @@ -193,8 +195,8 @@ public void shouldNotImplementLifecycleObserverInterface() { @Test public void shouldCreateCameraPluginAndSetAllFeatures() { final Activity mockActivity = mock(Activity.class); - final TextureRegistry.SurfaceProducer mockSurfaceProducer = - mock(TextureRegistry.SurfaceProducer.class); + final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = + mock(TextureRegistry.SurfaceTextureEntry.class); final CameraFeatureFactory spyMockCameraFeatureFactory = spy(mockCameraFeatureFactory); final String cameraName = "1"; final ResolutionPreset resolutionPreset = ResolutionPreset.high; @@ -208,7 +210,7 @@ public void shouldCreateCameraPluginAndSetAllFeatures() { Camera camera = new Camera( mockActivity, - mockSurfaceProducer, + mockFlutterTexture, spyMockCameraFeatureFactory, mockDartMessenger, mockCameraProperties, @@ -679,6 +681,7 @@ public void startPreview_shouldPullStreamFromVideoRenderer() VideoRenderer mockVideoRenderer = mock(VideoRenderer.class); ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); Size mockSize = mock(Size.class); camera.recordingVideo = true; camera.videoRenderer = mockVideoRenderer; @@ -687,8 +690,10 @@ public void startPreview_shouldPullStreamFromVideoRenderer() ImageReader mockPictureImageReader = mock(ImageReader.class); camera.pictureImageReader = mockPictureImageReader; + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); camera.startPreview(); @@ -701,6 +706,7 @@ public void startPreview_shouldPullStreamFromImageReader() throws InterruptedException, CameraAccessException { ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); Size mockSize = mock(Size.class); ImageReader mockImageReader = mock(ImageReader.class); camera.recordingVideo = false; @@ -708,8 +714,10 @@ public void startPreview_shouldPullStreamFromImageReader() CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); camera.cameraDevice = fakeCamera; + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(mockImageReader.getSurface()).thenReturn(mock(Surface.class)); @@ -723,6 +731,7 @@ public void startPreview_shouldFlipRotation() throws InterruptedException, Camer VideoRenderer mockVideoRenderer = mock(VideoRenderer.class); ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); Size mockSize = mock(Size.class); camera.recordingVideo = true; camera.videoRenderer = mockVideoRenderer; @@ -732,8 +741,10 @@ public void startPreview_shouldFlipRotation() throws InterruptedException, Camer ImageReader mockPictureImageReader = mock(ImageReader.class); camera.pictureImageReader = mockPictureImageReader; + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(mockCameraProperties.getLensFacing()).thenReturn(CameraMetadata.LENS_FACING_FRONT); @@ -756,8 +767,10 @@ public void startPreviewWithImageStream_shouldPullStreamsFromImageReaders() camera.cameraDevice = fakeCamera; camera.imageStreamReader = mockImageStreamReader; + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); camera.startPreviewWithImageStream(mock(EventChannel.class)); @@ -874,6 +887,7 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader Camera cameraSpy = spy(camera); ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); + SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); Size mockSize = mock(Size.class); MediaRecorder mockMediaRecorder = mock(MediaRecorder.class); ImageReader mockPictureImageReader = mock(ImageReader.class); @@ -884,8 +898,10 @@ public void startVideoRecording_shouldPullStreamsFromMediaRecorderAndImageReader cameraSpy.cameraDevice = fakeCamera; MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = cameraSpy.flutterTexture; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); doNothing().when(cameraSpy).prepareRecording(mockResult); @@ -1073,8 +1089,7 @@ public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAc camera.onConverged(); // A picture should be taken. verify(mockCaptureSession, times(1)).capture(any(), any(), any()); - // The session shuold not be aborted as part of this flow, as this breaks - // capture on some + // The session shuold not be aborted as part of this flow, as this breaks capture on some // devices, and causes delays on others. verify(mockCaptureSession, never()).abortCaptures(); } @@ -1082,14 +1097,19 @@ public void onConverge_shouldTakePictureWithoutAbortingSession() throws CameraAc @Test public void createCaptureSession_doesNotCloseCaptureSession() throws CameraAccessException { Surface mockSurface = mock(Surface.class); + SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); + ResolutionFeature mockResolutionFeature = mock(ResolutionFeature.class); Size mockSize = mock(Size.class); ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); CameraDeviceWrapper fakeCamera = new FakeCameraDeviceWrapper(mockRequestBuilders); camera.cameraDevice = fakeCamera; + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; + CameraFeatures cameraFeatures = camera.cameraFeatures; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); camera.createCaptureSession(CameraDevice.TEMPLATE_PREVIEW, mockSurface); @@ -1102,6 +1122,8 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest throws CameraAccessException { Surface mockSurface = mock(Surface.class); Surface mockSecondarySurface = mock(Surface.class); + SurfaceTexture mockSurfaceTexture = mock(SurfaceTexture.class); + ResolutionFeature mockResolutionFeature = mock(ResolutionFeature.class); Size mockSize = mock(Size.class); ArrayList mockRequestBuilders = new ArrayList<>(); mockRequestBuilders.add(mock(CaptureRequest.Builder.class)); @@ -1111,8 +1133,11 @@ public void createCaptureSession_shouldNotAddPictureImageSurfaceToPreviewRequest camera.pictureImageReader = mockPictureImageReader; CaptureRequest.Builder mockPreviewRequestBuilder = mock(CaptureRequest.Builder.class); + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; + CameraFeatures cameraFeatures = camera.cameraFeatures; ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); when(fakeCamera.createCaptureRequest(anyInt())).thenReturn(mockPreviewRequestBuilder); when(mockPictureImageReader.getSurface()).thenReturn(mockSurface); @@ -1149,18 +1174,19 @@ public void close_doesNotCloseCaptureSessionWhenCameraDeviceNonNull() { @Test public void startVideoRecording_shouldApplySettingsToMediaRecorder() throws InterruptedException, IOException, CameraAccessException { + final Activity mockActivity = mock(Activity.class); - final TextureRegistry.SurfaceProducer mockSurfaceProducer = - mock(TextureRegistry.SurfaceProducer.class); + final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = + mock(TextureRegistry.SurfaceTextureEntry.class); final String cameraName = "1"; final ResolutionPreset resolutionPreset = ResolutionPreset.high; final boolean enableAudio = true; - // region These parameters should be set in android MediaRecorder. + //region These parameters should be set in android MediaRecorder. final int fps = 15; final int videoBitrate = 200000; final int audioBitrate = 32000; - // endregion + //endregion when(mockCameraProperties.getCameraName()).thenReturn(cameraName); @@ -1183,6 +1209,7 @@ public void startVideoRecording_shouldApplySettingsToMediaRecorder() try (final MockedStatic mockFile = mockStatic(File.class); final MockedConstruction mockMediaRecorder = Mockito.mockConstruction(MediaRecorder.class)) { + assertNotNull(mockMediaRecorder); mockFile @@ -1195,7 +1222,7 @@ public void startVideoRecording_shouldApplySettingsToMediaRecorder() spy( new Camera( mockActivity, - mockSurfaceProducer, + mockFlutterTexture, mockCameraFeatureFactory, mockDartMessenger, mockCameraProperties, @@ -1228,15 +1255,19 @@ public void startVideoRecording_shouldApplySettingsToMediaRecorder() camera.cameraDevice = fakeCamera; MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + TextureRegistry.SurfaceTextureEntry cameraFlutterTexture = camera.flutterTexture; + ResolutionFeature resolutionFeature = mockCameraFeatureFactory.mockResolutionFeature; + assertNotNull(cameraFlutterTexture); + when(cameraFlutterTexture.surfaceTexture()).thenReturn(mockSurfaceTexture); + assertNotNull(resolutionFeature); when(resolutionFeature.getPreviewSize()).thenReturn(mockSize); camera.startVideoRecording(mockResult, null); - // region Check that FPS parameter affects AE range at which the camera captures - // frames. + //region Check that FPS parameter affects AE range at which the camera captures frames. assertEquals(camera.cameraFeatures.getFpsRange().getValue().getLower(), Integer.valueOf(fps)); assertEquals(camera.cameraFeatures.getFpsRange().getValue().getUpper(), Integer.valueOf(fps)); @@ -1245,15 +1276,15 @@ public void startVideoRecording_shouldApplySettingsToMediaRecorder() eq(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE), argThat( (Range range) -> range.getLower() == fps && range.getUpper() == fps)); - // endregion + //endregion final MediaRecorder recorder = camera.mediaRecorder; - // region Check that parameters affects movies, written by MediaRecorder. + //region Check that parameters affects movies, written by MediaRecorder. verify(recorder).setVideoFrameRate(fps); verify(recorder).setAudioEncodingBitRate(audioBitrate); verify(recorder).setVideoEncodingBitRate(videoBitrate); - // endregion + //endregion } } diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest_getRecordingProfileTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest_getRecordingProfileTest.java index 8791ecdcff9f..c5a97a19aca7 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest_getRecordingProfileTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/CameraTest_getRecordingProfileTest.java @@ -60,15 +60,15 @@ public void before() { mockDartMessenger = mock(DartMessenger.class); final Activity mockActivity = mock(Activity.class); - final TextureRegistry.SurfaceProducer mockSurfaceProducer = - mock(TextureRegistry.SurfaceProducer.class); + final TextureRegistry.SurfaceTextureEntry mockFlutterTexture = + mock(TextureRegistry.SurfaceTextureEntry.class); final ResolutionPreset resolutionPreset = ResolutionPreset.high; final boolean enableAudio = false; camera = new Camera( mockActivity, - mockSurfaceProducer, + mockFlutterTexture, mockCameraFeatureFactory, mockDartMessenger, mockCameraProperties, diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 568a4a1b3ad2..178c15de795b 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -3,7 +3,7 @@ description: Android implementation of the camera plugin. repository: https://github.com/flutter/packages/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.9+5 +version: 0.10.9+6 environment: sdk: ^3.4.0