1.前言
在开发Android13时,发现,打开SystemUI时,应用通过DisplayMetrics获取分辨率是,获取的值是被SystemUI占用后剩余的,如实际分辨率是1280x800,获取得到的是1280x752,实际上是SystemUI占用的48,我们需要修改系统来满足应用通过获取DisplayMetrics分辨率是屏的正式分辨率以对应适配使用。
2.修改方法
修改framewore层代码,如下:
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
old mode 100644
new mode 100755
index 613e675..552d021
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -2039,11 +2073,13 @@ public class DisplayPolicy {
final Insets decor = calculateDecorInsetsWithInternalTypes(insetsState);
final Insets statusBar = insetsState.calculateInsets(displayFrame,
Type.statusBars(), true /* ignoreVisibility */);
- mNonDecorInsets.set(decor.left, decor.top, decor.right, decor.bottom);
+ //mNonDecorInsets.set(decor.left, decor.top, decor.right, decor.bottom);
+ mNonDecorInsets.set(decor.left, decor.top, decor.right, 0);
mConfigInsets.set(Math.max(statusBar.left, decor.left),
Math.max(statusBar.top, decor.top),
Math.max(statusBar.right, decor.right),
- Math.max(statusBar.bottom, decor.bottom));
+ Math.max(statusBar.bottom, 0));
+ //Math.max(statusBar.bottom, decor.bottom));
mNonDecorFrame.set(displayFrame);
mNonDecorFrame.inset(mNonDecorInsets);
mConfigFrame.set(displayFrame);
3.结果
通过DisplayMetrics获取分辨率正确,通过adb下wm size获取也正确。