diff --git a/src/plugins/platforms/android/qandroidplatformscreen.cpp b/src/plugins/platforms/android/qandroidplatformscreen.cpp index b2fa2ed3e54..4d046685ff6 100644 --- a/src/plugins/platforms/android/qandroidplatformscreen.cpp +++ b/src/plugins/platforms/android/qandroidplatformscreen.cpp @@ -53,6 +53,7 @@ private: #endif Q_DECLARE_JNI_CLASS(Display, "android/view/Display") +Q_DECLARE_JNI_CLASS(DisplayMetrics, "android/util/DisplayMetrics") Q_DECLARE_JNI_TYPE(DisplayMode, "Landroid/view/Display$Mode;") @@ -79,12 +80,21 @@ QAndroidPlatformScreen::QAndroidPlatformScreen(const QJniObject &displayObject) if (!displayObject.isValid()) return; - m_size = QSize(displayObject.callMethod("getWidth"), displayObject.callMethod("getHeight")); m_name = displayObject.callObjectMethod("getName").toString(); m_refreshRate = displayObject.callMethod("getRefreshRate"); m_displayId = displayObject.callMethod("getDisplayId"); + QJniObject displayMetricsObj(QtJniTypes::className()); + displayObject.callMethod("getRealMetrics", displayMetricsObj.object()); + + const int widthPixels = displayMetricsObj.getField("widthPixels"); + const int heightPixels = displayMetricsObj.getField("heightPixels"); + m_size = QSize(widthPixels, heightPixels); + if (QNativeInterface::QAndroidApplication::sdkVersion() >= 23) { + const qreal xdpi = displayMetricsObj.getField("xdpi"); + const qreal ydpi = displayMetricsObj.getField("ydpi"); + const QJniObject currentMode = displayObject.callObjectMethod("getMode"); const jint currentModeId = currentMode.callMethod("getModeId"); @@ -96,8 +106,9 @@ QAndroidPlatformScreen::QAndroidPlatformScreen(const QJniObject &displayObject) const auto size = env->GetArrayLength(modeArray); for (jsize i = 0; i < size; ++i) { const auto mode = QJniObject::fromLocalRef(env->GetObjectArrayElement(modeArray, i)); - const int physicalWidth = mode.callMethod("getPhysicalWidth"); - const int physicalHeight = mode.callMethod("getPhysicalHeight"); + // Physical sizes in millimeters + const int physicalWidth = qRound(mode.callMethod("getPhysicalWidth") / xdpi * 25.4); + const int physicalHeight = qRound(mode.callMethod("getPhysicalHeight") / ydpi * 25.4); if (currentModeId == mode.callMethod("getModeId")) { m_currentMode = i;