From 6e0e0529b39333a109efd10385f206145f56c9d9 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 31 Jan 2023 16:10:36 -0800 Subject: [PATCH 1/7] Make changes, start test --- .../io/flutter/plugins/camera/Camera.java | 7 ++- .../resolution/ResolutionFeature.java | 27 +++++++---- .../camera/media/MediaRecorderBuilder.java | 2 +- .../resolution/ResolutionFeatureTest.java | 47 +++++++++++++++++++ 4 files changed, 72 insertions(+), 11 deletions(-) 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 7c592b9c7e99..60ff80875263 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 @@ -258,8 +258,11 @@ private void prepareMediaRecorder(String outputFilePath) throws IOException { MediaRecorderBuilder mediaRecorderBuilder; - if (Build.VERSION.SDK_INT >= 31) { - mediaRecorderBuilder = new MediaRecorderBuilder(getRecordingProfile(), outputFilePath); + // 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. + EncoderProfiles recordingProfile = getRecordingProfile(); + if (Build.VERSION.SDK_INT >= 31 && recordingProfile != null) { + mediaRecorderBuilder = new MediaRecorderBuilder(recordingProfile, outputFilePath); } else { mediaRecorderBuilder = new MediaRecorderBuilder(getRecordingProfileLegacy(), outputFilePath); } diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/resolution/ResolutionFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/resolution/ResolutionFeature.java index afbd7c3758a6..02e66950499c 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/resolution/ResolutionFeature.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/resolution/ResolutionFeature.java @@ -120,13 +120,15 @@ static Size computeBestPreviewSize(int cameraId, ResolutionPreset preset) List videoProfiles = profile.getVideoProfiles(); EncoderProfiles.VideoProfile defaultVideoProfile = videoProfiles.get(0); - return new Size(defaultVideoProfile.getWidth(), defaultVideoProfile.getHeight()); - } else { - @SuppressWarnings("deprecation") - CamcorderProfile profile = - getBestAvailableCamcorderProfileForResolutionPresetLegacy(cameraId, preset); - return new Size(profile.videoFrameWidth, profile.videoFrameHeight); + if (defaultVideoProfile != null) { + return new Size(defaultVideoProfile.getWidth(), defaultVideoProfile.getHeight()); + } } + + @SuppressWarnings("deprecation") + CamcorderProfile profile = + getBestAvailableCamcorderProfileForResolutionPresetLegacy(cameraId, preset); + return new Size(profile.videoFrameWidth, profile.videoFrameHeight); } /** @@ -234,15 +236,24 @@ private void configureResolution(ResolutionPreset resolutionPreset, int cameraId if (!checkIsSupported()) { return; } + boolean captureSizeCalculated = false; if (Build.VERSION.SDK_INT >= 31) { + recordingProfileLegacy = null; recordingProfile = getBestAvailableCamcorderProfileForResolutionPreset(cameraId, resolutionPreset); List videoProfiles = recordingProfile.getVideoProfiles(); EncoderProfiles.VideoProfile defaultVideoProfile = videoProfiles.get(0); - captureSize = new Size(defaultVideoProfile.getWidth(), defaultVideoProfile.getHeight()); - } else { + + if (defaultVideoProfile != null) { + captureSizeCalculated = true; + captureSize = new Size(defaultVideoProfile.getWidth(), defaultVideoProfile.getHeight()); + } + } + + if (!captureSizeCalculated) { + recordingProfile = null; @SuppressWarnings("deprecation") CamcorderProfile camcorderProfile = getBestAvailableCamcorderProfileForResolutionPresetLegacy(cameraId, resolutionPreset); diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java index 0aebfee39e0a..5b62d1198962 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java @@ -75,7 +75,7 @@ public MediaRecorder build() throws IOException, NullPointerException, IndexOutO if (enableAudio) mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); - if (Build.VERSION.SDK_INT >= 31) { + if (Build.VERSION.SDK_INT >= 31 && encoderProfiles != null) { EncoderProfiles.VideoProfile videoProfile = encoderProfiles.getVideoProfiles().get(0); EncoderProfiles.AudioProfile audioProfile = encoderProfiles.getAudioProfiles().get(0); diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java index 957b57a66435..9ced13f8ecd2 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java @@ -5,7 +5,11 @@ package io.flutter.plugins.camera.features.resolution; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.when; @@ -13,12 +17,14 @@ import android.media.CamcorderProfile; import android.media.EncoderProfiles; import io.flutter.plugins.camera.CameraProperties; +import java.util.ArrayList; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockedStatic; +import org.mockito.stubbing.Answer; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; @@ -329,4 +335,45 @@ public void computeBestPreviewSize_shouldUseQVGAWhenResolutionPresetLow() { mockedStaticProfile.verify(() -> CamcorderProfile.getAll("1", CamcorderProfile.QUALITY_QVGA)); } + + // @Config(minSdk = 31) + // @Test + // public void computeBestPreviewSize_shouldUseLegacyBehaviorWhenEncoderProfilesNull() { + + // } + + @Config(minSdk = 31) + @Test + public void resolutionFeatureShouldUseLegacyBehaviorWhenEconderProfilesNull() { + try (MockedStatic mockedResolutionFeature = + mockStatic(ResolutionFeature.class)) { + mockedResolutionFeature + .when( + () -> + ResolutionFeature.getBestAvailableCamcorderProfileForResolutionPreset( + anyInt(), any(ResolutionPreset.class))) + .thenAnswer( + (Answer) + invocation -> { + EncoderProfiles mockEncoderProfiles = mock(EncoderProfiles.class); + List videoProfiles = + new ArrayList() { + { + add(null); + } + }; + when(mockEncoderProfiles.getVideoProfiles()).thenReturn(videoProfiles); + return mockEncoderProfiles; + }); + + beforeLegacy(); + CameraProperties mockCameraProperties = mock(CameraProperties.class); + ResolutionPreset mockResolutionPreset = mock(ResolutionPreset.class); + ResolutionFeature resolutionFeature = + new ResolutionFeature(mockCameraProperties, mockResolutionPreset, "testCameraName"); + + assertNotNull(resolutionFeature.getRecordingProfileLegacy()); + assertNull(resolutionFeature.getRecordingProfile()); + } + } } From 7decb0f87bec39210a666b114b2a25f206d411c6 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 31 Jan 2023 16:17:00 -0800 Subject: [PATCH 2/7] Bump versions --- packages/camera/camera_android/CHANGELOG.md | 4 ++++ packages/camera/camera_android/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index 0cb9957d029d..4609b402058a 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.4 + +* Temporarily fixes issue with requested video profiles being null by falling back to deprecated behavior in that case. + ## 0.10.3 * Adds back use of Optional type. diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index fed2d29fb59f..fb3371912911 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.3 +version: 0.10.4 environment: sdk: ">=2.14.0 <3.0.0" From 228d381ae16d6baf002cc35f005568097f90420d Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 31 Jan 2023 16:38:17 -0800 Subject: [PATCH 3/7] Add test --- .../resolution/ResolutionFeatureTest.java | 49 +++++++++++++++++-- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java index 9ced13f8ecd2..00c57fb06d45 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java @@ -16,6 +16,7 @@ import android.media.CamcorderProfile; import android.media.EncoderProfiles; +import android.util.Size; import io.flutter.plugins.camera.CameraProperties; import java.util.ArrayList; import java.util.List; @@ -336,11 +337,50 @@ public void computeBestPreviewSize_shouldUseQVGAWhenResolutionPresetLow() { mockedStaticProfile.verify(() -> CamcorderProfile.getAll("1", CamcorderProfile.QUALITY_QVGA)); } - // @Config(minSdk = 31) - // @Test - // public void computeBestPreviewSize_shouldUseLegacyBehaviorWhenEncoderProfilesNull() { + @Config(minSdk = 31) + @Test + public void computeBestPreviewSize_shouldUseLegacyBehaviorWhenEncoderProfilesNull() { + try (MockedStatic mockedResolutionFeature = + mockStatic(ResolutionFeature.class)) { + mockedResolutionFeature + .when( + () -> + ResolutionFeature.getBestAvailableCamcorderProfileForResolutionPreset( + anyInt(), any(ResolutionPreset.class))) + .thenAnswer( + (Answer) + invocation -> { + EncoderProfiles mockEncoderProfiles = mock(EncoderProfiles.class); + List videoProfiles = + new ArrayList() { + { + add(null); + } + }; + when(mockEncoderProfiles.getVideoProfiles()).thenReturn(videoProfiles); + return mockEncoderProfiles; + }); - // } + mockedResolutionFeature + .when( + () -> + ResolutionFeature.getBestAvailableCamcorderProfileForResolutionPresetLegacy( + anyInt(), any(ResolutionPreset.class))) + .thenAnswer( + (Answer) + invocation -> { + CamcorderProfile mockCamcorderProfile = mock(CamcorderProfile.class); + mockCamcorderProfile.videoFrameWidth = 10; + mockCamcorderProfile.videoFrameHeight = 50; + return mockCamcorderProfile; + } + ); + + Size testPreviewSize = ResolutionFeature.computeBestPreviewSize(1, ResolutionPreset.max); + assertEquals(testPreviewSize.getWidth(), 10); + assertEquals(testPreviewSize.getHeight(), 50); + } + } @Config(minSdk = 31) @Test @@ -366,7 +406,6 @@ public void resolutionFeatureShouldUseLegacyBehaviorWhenEconderProfilesNull() { return mockEncoderProfiles; }); - beforeLegacy(); CameraProperties mockCameraProperties = mock(CameraProperties.class); ResolutionPreset mockResolutionPreset = mock(ResolutionPreset.class); ResolutionFeature resolutionFeature = From ee2ea4e67a23d94edb24e0e4eecbc71de5f47e19 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 31 Jan 2023 16:42:43 -0800 Subject: [PATCH 4/7] Formatting --- .../resolution/ResolutionFeatureTest.java | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java index 00c57fb06d45..d5711ac11b81 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java @@ -362,23 +362,22 @@ public void computeBestPreviewSize_shouldUseLegacyBehaviorWhenEncoderProfilesNul }); mockedResolutionFeature - .when( - () -> - ResolutionFeature.getBestAvailableCamcorderProfileForResolutionPresetLegacy( - anyInt(), any(ResolutionPreset.class))) - .thenAnswer( - (Answer) - invocation -> { - CamcorderProfile mockCamcorderProfile = mock(CamcorderProfile.class); - mockCamcorderProfile.videoFrameWidth = 10; - mockCamcorderProfile.videoFrameHeight = 50; - return mockCamcorderProfile; - } - ); - - Size testPreviewSize = ResolutionFeature.computeBestPreviewSize(1, ResolutionPreset.max); - assertEquals(testPreviewSize.getWidth(), 10); - assertEquals(testPreviewSize.getHeight(), 50); + .when( + () -> + ResolutionFeature.getBestAvailableCamcorderProfileForResolutionPresetLegacy( + anyInt(), any(ResolutionPreset.class))) + .thenAnswer( + (Answer) + invocation -> { + CamcorderProfile mockCamcorderProfile = mock(CamcorderProfile.class); + mockCamcorderProfile.videoFrameWidth = 10; + mockCamcorderProfile.videoFrameHeight = 50; + return mockCamcorderProfile; + }); + + Size testPreviewSize = ResolutionFeature.computeBestPreviewSize(1, ResolutionPreset.max); + assertEquals(testPreviewSize.getWidth(), 10); + assertEquals(testPreviewSize.getHeight(), 50); } } From a78fba969e12f055f442e7b9f70fb6ab52ef8d2f Mon Sep 17 00:00:00 2001 From: camsim99 Date: Tue, 31 Jan 2023 16:49:14 -0800 Subject: [PATCH 5/7] Add issue --- .../android/src/main/java/io/flutter/plugins/camera/Camera.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 60ff80875263..e7dabbabde90 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 @@ -259,7 +259,7 @@ 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. + // once this has largely been fixed on the Android side. https://github.com/flutter/flutter/issues/119668 EncoderProfiles recordingProfile = getRecordingProfile(); if (Build.VERSION.SDK_INT >= 31 && recordingProfile != null) { mediaRecorderBuilder = new MediaRecorderBuilder(recordingProfile, outputFilePath); From 8602598560469ed5b29af003d142f621fd26b9de Mon Sep 17 00:00:00 2001 From: camsim99 Date: Wed, 1 Feb 2023 12:48:32 -0800 Subject: [PATCH 6/7] Fix test --- .../resolution/ResolutionFeatureTest.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java index d5711ac11b81..dbc352d697a4 100644 --- a/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java +++ b/packages/camera/camera_android/android/src/test/java/io/flutter/plugins/camera/features/resolution/ResolutionFeatureTest.java @@ -360,7 +360,6 @@ public void computeBestPreviewSize_shouldUseLegacyBehaviorWhenEncoderProfilesNul when(mockEncoderProfiles.getVideoProfiles()).thenReturn(videoProfiles); return mockEncoderProfiles; }); - mockedResolutionFeature .when( () -> @@ -374,6 +373,9 @@ public void computeBestPreviewSize_shouldUseLegacyBehaviorWhenEncoderProfilesNul mockCamcorderProfile.videoFrameHeight = 50; return mockCamcorderProfile; }); + mockedResolutionFeature + .when(() -> ResolutionFeature.computeBestPreviewSize(1, ResolutionPreset.max)) + .thenCallRealMethod(); Size testPreviewSize = ResolutionFeature.computeBestPreviewSize(1, ResolutionPreset.max); assertEquals(testPreviewSize.getWidth(), 10); @@ -383,7 +385,8 @@ public void computeBestPreviewSize_shouldUseLegacyBehaviorWhenEncoderProfilesNul @Config(minSdk = 31) @Test - public void resolutionFeatureShouldUseLegacyBehaviorWhenEconderProfilesNull() { + public void resolutionFeatureShouldUseLegacyBehaviorWhenEncoderProfilesNull() { + beforeLegacy(); try (MockedStatic mockedResolutionFeature = mockStatic(ResolutionFeature.class)) { mockedResolutionFeature @@ -404,11 +407,21 @@ public void resolutionFeatureShouldUseLegacyBehaviorWhenEconderProfilesNull() { when(mockEncoderProfiles.getVideoProfiles()).thenReturn(videoProfiles); return mockEncoderProfiles; }); + mockedResolutionFeature + .when( + () -> + ResolutionFeature.getBestAvailableCamcorderProfileForResolutionPresetLegacy( + anyInt(), any(ResolutionPreset.class))) + .thenAnswer( + (Answer) + invocation -> { + CamcorderProfile mockCamcorderProfile = mock(CamcorderProfile.class); + return mockCamcorderProfile; + }); CameraProperties mockCameraProperties = mock(CameraProperties.class); - ResolutionPreset mockResolutionPreset = mock(ResolutionPreset.class); ResolutionFeature resolutionFeature = - new ResolutionFeature(mockCameraProperties, mockResolutionPreset, "testCameraName"); + new ResolutionFeature(mockCameraProperties, ResolutionPreset.max, cameraName); assertNotNull(resolutionFeature.getRecordingProfileLegacy()); assertNull(resolutionFeature.getRecordingProfile()); From be47056ddb024cbbba273ef943ba1b100e513282 Mon Sep 17 00:00:00 2001 From: camsim99 Date: Thu, 2 Feb 2023 13:52:11 -0800 Subject: [PATCH 7/7] Address review --- .../src/main/java/io/flutter/plugins/camera/Camera.java | 2 +- .../camera/features/resolution/ResolutionFeature.java | 6 ++++-- .../flutter/plugins/camera/media/MediaRecorderBuilder.java | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) 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 e7dabbabde90..b02d6864b5b7 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 @@ -261,7 +261,7 @@ private void prepareMediaRecorder(String outputFilePath) throws IOException { // 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 EncoderProfiles recordingProfile = getRecordingProfile(); - if (Build.VERSION.SDK_INT >= 31 && recordingProfile != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && recordingProfile != null) { mediaRecorderBuilder = new MediaRecorderBuilder(recordingProfile, outputFilePath); } else { mediaRecorderBuilder = new MediaRecorderBuilder(getRecordingProfileLegacy(), outputFilePath); diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/resolution/ResolutionFeature.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/resolution/ResolutionFeature.java index 02e66950499c..0ec2fbef87de 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/resolution/ResolutionFeature.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/features/resolution/ResolutionFeature.java @@ -114,7 +114,7 @@ static Size computeBestPreviewSize(int cameraId, ResolutionPreset preset) if (preset.ordinal() > ResolutionPreset.high.ordinal()) { preset = ResolutionPreset.high; } - if (Build.VERSION.SDK_INT >= 31) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { EncoderProfiles profile = getBestAvailableCamcorderProfileForResolutionPreset(cameraId, preset); List videoProfiles = profile.getVideoProfiles(); @@ -126,6 +126,8 @@ static Size computeBestPreviewSize(int cameraId, ResolutionPreset preset) } @SuppressWarnings("deprecation") + // TODO(camsim99): Suppression is currently safe because legacy code is used as a fallback for SDK >= S. + // This should be removed when reverting that fallback behavior: https://github.com/flutter/flutter/issues/119668. CamcorderProfile profile = getBestAvailableCamcorderProfileForResolutionPresetLegacy(cameraId, preset); return new Size(profile.videoFrameWidth, profile.videoFrameHeight); @@ -238,7 +240,7 @@ private void configureResolution(ResolutionPreset resolutionPreset, int cameraId } boolean captureSizeCalculated = false; - if (Build.VERSION.SDK_INT >= 31) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { recordingProfileLegacy = null; recordingProfile = getBestAvailableCamcorderProfileForResolutionPreset(cameraId, resolutionPreset); diff --git a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java index 5b62d1198962..1f9f6200bb99 100644 --- a/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java +++ b/packages/camera/camera_android/android/src/main/java/io/flutter/plugins/camera/media/MediaRecorderBuilder.java @@ -75,7 +75,7 @@ public MediaRecorder build() throws IOException, NullPointerException, IndexOutO if (enableAudio) mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); - if (Build.VERSION.SDK_INT >= 31 && encoderProfiles != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && encoderProfiles != null) { EncoderProfiles.VideoProfile videoProfile = encoderProfiles.getVideoProfiles().get(0); EncoderProfiles.AudioProfile audioProfile = encoderProfiles.getAudioProfiles().get(0);