diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
index 8663f8c5f22b4db818770b4094feba4b4f308c9a..b0dd7d9008048171f747386bd58629d5e1ba2077 100644
--- a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
+++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
@@ -52,6 +52,7 @@
 #include <qvideoframe.h>
 #include <private/qmemoryvideobuffer_p.h>
 #include <private/qvideoframe_p.h>
+#include <QtCore/private/qjnihelpers_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -443,6 +444,11 @@ bool QAndroidCameraSession::startPreview()
 
     AndroidMultimediaUtils::enableOrientationListener(true);
 
+    // Before API level 24 the orientation was always 0, which is what we're expecting, so
+    // we'll enforce that here.
+    if (QtAndroidPrivate::androidSdkVersion() > 23)
+        m_camera->setDisplayOrientation(0);
+
     m_camera->startPreview();
     m_previewStarted = true;
 
diff --git a/src/plugins/android/src/wrappers/jni/androidcamera.cpp b/src/plugins/android/src/wrappers/jni/androidcamera.cpp
index 76d3ffb44e68017a7f998ab8270ab5567e876141..0f2a4353171d5c65cf301458eac87e8525752bee 100644
--- a/src/plugins/android/src/wrappers/jni/androidcamera.cpp
+++ b/src/plugins/android/src/wrappers/jni/androidcamera.cpp
@@ -196,6 +196,7 @@ public:
     Q_INVOKABLE void updatePreviewSize();
     Q_INVOKABLE bool setPreviewTexture(void *surfaceTexture);
     Q_INVOKABLE bool setPreviewDisplay(void *surfaceHolder);
+    Q_INVOKABLE void setDisplayOrientation(int degrees);
 
     Q_INVOKABLE bool isZoomSupported();
     Q_INVOKABLE int getMaxZoom();
@@ -481,6 +482,12 @@ bool AndroidCamera::setPreviewDisplay(AndroidSurfaceHolder *surfaceHolder)
     return ok;
 }
 
+void AndroidCamera::setDisplayOrientation(int degrees)
+{
+    Q_D(AndroidCamera);
+    QMetaObject::invokeMethod(d, "setDisplayOrientation", Qt::QueuedConnection, Q_ARG(int, degrees));
+}
+
 bool AndroidCamera::isZoomSupported()
 {
     Q_D(AndroidCamera);
@@ -1079,6 +1086,11 @@ bool AndroidCameraPrivate::setPreviewDisplay(void *surfaceHolder)
     return !exceptionCheckAndClear(env);
 }
 
+void AndroidCameraPrivate::setDisplayOrientation(int degrees)
+{
+    m_camera.callMethod<void>("setDisplayOrientation", "(I)V", degrees);
+}
+
 bool AndroidCameraPrivate::isZoomSupported()
 {
     QMutexLocker parametersLocker(&m_parametersMutex);
diff --git a/src/plugins/android/src/wrappers/jni/androidcamera.h b/src/plugins/android/src/wrappers/jni/androidcamera.h
index 1a59ff3c7f6456f511548497a7f3af124f06ffdf..e58a81f8e39cca47400cbc25a2bc5c25c8426746 100644
--- a/src/plugins/android/src/wrappers/jni/androidcamera.h
+++ b/src/plugins/android/src/wrappers/jni/androidcamera.h
@@ -136,6 +136,7 @@ public:
     void setPreviewSize(const QSize &size);
     bool setPreviewTexture(AndroidSurfaceTexture *surfaceTexture);
     bool setPreviewDisplay(AndroidSurfaceHolder *surfaceHolder);
+    void setDisplayOrientation(int degrees);
 
     bool isZoomSupported();
     int getMaxZoom();