[camera] Fix the orientation of videos recorded in landscape on Android (#4946)
diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md
index cf50222..b864432 100644
--- a/packages/camera/camera/CHANGELOG.md
+++ b/packages/camera/camera/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.9.4+20
+
+* Fixes an issue with the orientation of videos recorded in landscape on Android.
+
## 0.9.4+19
* Migrate deprecated Scaffold SnackBar methods to ScaffoldMessenger.
diff --git a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManager.java b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManager.java
index dd1e489..ec6fa13 100644
--- a/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManager.java
+++ b/packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManager.java
@@ -142,26 +142,32 @@
}
/**
- * Returns the device's video orientation in degrees based on the sensor orientation and the last
- * known UI orientation.
+ * Returns the device's video orientation in clockwise degrees based on the sensor orientation and
+ * the last known UI orientation.
*
* <p>Returns one of 0, 90, 180 or 270.
*
- * @return The device's video orientation in degrees.
+ * @return The device's video orientation in clockwise degrees.
*/
public int getVideoOrientation() {
return this.getVideoOrientation(this.lastOrientation);
}
/**
- * Returns the device's video orientation in degrees based on the sensor orientation and the
- * supplied {@link PlatformChannel.DeviceOrientation} value.
+ * Returns the device's video orientation in clockwise degrees based on the sensor orientation and
+ * the supplied {@link PlatformChannel.DeviceOrientation} value.
*
* <p>Returns one of 0, 90, 180 or 270.
*
+ * <p>More details can be found in the official Android documentation:
+ * https://developer.android.com/reference/android/media/MediaRecorder#setOrientationHint(int)
+ *
+ * <p>See also:
+ * https://developer.android.com/training/camera2/camera-preview-large-screens#orientation_calculation
+ *
* @param orientation The {@link PlatformChannel.DeviceOrientation} value that is to be converted
* into degrees.
- * @return The device's video orientation in degrees.
+ * @return The device's video orientation in clockwise degrees.
*/
public int getVideoOrientation(PlatformChannel.DeviceOrientation orientation) {
int angle = 0;
@@ -179,10 +185,10 @@
angle = 180;
break;
case LANDSCAPE_LEFT:
- angle = 90;
+ angle = 270;
break;
case LANDSCAPE_RIGHT:
- angle = 270;
+ angle = 90;
break;
}
diff --git a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManagerTest.java b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManagerTest.java
index 82449a1..3762006 100644
--- a/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManagerTest.java
+++ b/packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/features/sensororientation/DeviceOrientationManagerTest.java
@@ -62,9 +62,9 @@
deviceOrientationManager.getVideoOrientation(DeviceOrientation.LANDSCAPE_RIGHT);
assertEquals(0, degreesPortraitUp);
- assertEquals(90, degreesLandscapeLeft);
+ assertEquals(270, degreesLandscapeLeft);
assertEquals(180, degreesPortraitDown);
- assertEquals(270, degreesLandscapeRight);
+ assertEquals(90, degreesLandscapeRight);
}
@Test
@@ -81,18 +81,30 @@
orientationManager.getVideoOrientation(DeviceOrientation.LANDSCAPE_RIGHT);
assertEquals(90, degreesPortraitUp);
- assertEquals(180, degreesLandscapeLeft);
+ assertEquals(0, degreesLandscapeLeft);
assertEquals(270, degreesPortraitDown);
- assertEquals(0, degreesLandscapeRight);
+ assertEquals(180, degreesLandscapeRight);
}
@Test
- public void getVideoOrientation_shouldFallbackToSensorOrientationWhenOrientationIsNull() {
- setUpUIOrientationMocks(Configuration.ORIENTATION_LANDSCAPE, Surface.ROTATION_0);
+ public void getVideoOrientation_fallbackToPortraitSensorOrientationWhenOrientationIsNull() {
+ setUpUIOrientationMocks(Configuration.ORIENTATION_PORTRAIT, Surface.ROTATION_0);
int degrees = deviceOrientationManager.getVideoOrientation(null);
- assertEquals(90, degrees);
+ assertEquals(0, degrees);
+ }
+
+ @Test
+ public void getVideoOrientation_fallbackToLandscapeSensorOrientationWhenOrientationIsNull() {
+ setUpUIOrientationMocks(Configuration.ORIENTATION_LANDSCAPE, Surface.ROTATION_0);
+
+ DeviceOrientationManager orientationManager =
+ DeviceOrientationManager.create(mockActivity, mockDartMessenger, false, 90);
+
+ int degrees = orientationManager.getVideoOrientation(null);
+
+ assertEquals(0, degrees);
}
@Test
diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml
index 2533583..feb83f9 100644
--- a/packages/camera/camera/pubspec.yaml
+++ b/packages/camera/camera/pubspec.yaml
@@ -4,7 +4,7 @@
Dart.
repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
-version: 0.9.4+19
+version: 0.9.4+20
environment:
sdk: ">=2.14.0 <3.0.0"