【3588】Android动态隐藏导航栏

本文介绍瑞芯微RK3566/RK3568在Android11系统下,动态屏蔽导航栏/状态栏方法。

原始问题是打开客户apk的时候导航栏不会自动隐藏,,会导致应用有一部分显示被导航栏遮住,正常的需求是打开apk之后过一段时间导航栏隐藏起来,上划再出现。

下面是直接能用的补丁:

c 复制代码
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index f125b7d100..066a9400d5 100644
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -248,6 +248,9 @@ public class StatusBar extends SystemUI implements DemoMode,
         LifecycleOwner, BatteryController.BatteryStateChangeCallback {
     public static final boolean MULTIUSER_DEBUG = false;
 
+    private RegisterStatusBarResult mRegisterStatusBarResult;
+    static final String HIDE_NAVIGATION_BAR = "android.intent.action.HIDE_NAVIGATION_BAR";
+static final String SHOW_NAVIGATION_BAR = "android.intent.action.SHOW_NAVIGATION_BAR";
     protected static final int MSG_HIDE_RECENT_APPS = 1020;
     protected static final int MSG_PRELOAD_RECENT_APPS = 1022;
     protected static final int MSG_CANCEL_PRELOAD_RECENT_APPS = 1023;
@@ -869,6 +872,7 @@ public class StatusBar extends SystemUI implements DemoMode,
             ex.rethrowFromSystemServer();
         }
 
+        mRegisterStatusBarResult = result;
         createAndAddWindows(result);
 
         if (mWallpaperSupported) {
@@ -1288,6 +1292,8 @@ public class StatusBar extends SystemUI implements DemoMode,
         filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
         filter.addAction(Intent.ACTION_SCREEN_OFF);
         filter.addAction(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG);
+        filter.addAction(HIDE_NAVIGATION_BAR);
+        filter.addAction(SHOW_NAVIGATION_BAR);
         mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL);
     }
 
@@ -2804,10 +2810,43 @@ public class StatusBar extends SystemUI implements DemoMode,
             }
             else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) {
                 mQSPanel.showDeviceMonitoringDialog();
+            } else if (HIDE_NAVIGATION_BAR.equals(action)) {
+                Log.d(TAG,"yjr1107 hideNavigation 0");
+                hideNavigation();
+            } else if (SHOW_NAVIGATION_BAR.equals(action)) {
+                Log.d(TAG,"yjr1107 displayNavigation 1");
+                displayNavigation();
             }
         }
     };
 
+    public void hideNavigation() {
+        NavigationBarView mNavigationBarView = mNavigationBarController.getDefaultNavigationBarView();
+        Log.d(TAG,"yjr1107 hideNavigation 1");
+        if (mNavigationBarView != null) {
+            Log.d(TAG,"yjr1107 hideNavigation 2");
+            mNavigationBarController.onDisplayRemoved(mDisplayId);
+        }
+	if (mPhoneStatusBarWindow != null){
+		Log.d(TAG,"yjr1107 hideNavigation 3");
+                           mPhoneStatusBarWindow.setVisibility(View.GONE);
+	}
+    }
+    public void displayNavigation() {
+        Log.d(TAG,"yjr1107 displayNavigation 1");
+        NavigationBarView mNavigationBarView = mNavigationBarController.getDefaultNavigationBarView();
+        if (mNavigationBarView == null) {
+            Log.d(TAG,"yjr1107 displayNavigation 2");
+            createNavigationBar(mRegisterStatusBarResult);
+        }
+        if (mPhoneStatusBarWindow != null){
+		Log.d(TAG,"yjr1107 displayNavigation 3");
+                     mPhoneStatusBarWindow.setVisibility(View.VISIBLE);
+		     requestNotificationUpdate("StatusBar state changed");
+            checkBarModes();
+	}
+    }
+
     private final BroadcastReceiver mDemoReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
diff --git a/frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java b/frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java
index 29881cc761..2e305824c9 100644
--- a/frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wm;
 
+import android.util.Log;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
@@ -448,6 +449,8 @@ public class DisplayPolicy {
     private static final int MSG_ENABLE_POINTER_LOCATION = 4;
     private static final int MSG_DISABLE_POINTER_LOCATION = 5;
 
+    private static final int MSG_HIDE_NAVIGATIONBAR = 30;
+    private static final int MSG_SHOW_NAVIGATIONBAR = 31;
     private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0;
     private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1;
 
@@ -480,6 +483,16 @@ public class DisplayPolicy {
                 case MSG_DISABLE_POINTER_LOCATION:
                     disablePointerLocation();
                     break;
+                case MSG_SHOW_NAVIGATIONBAR:
+                    Log.d(TAG, "yjr MSG_SHOW_NAVIGATIONBAR");
+		    Intent test1 = new Intent("android.intent.action.SHOW_NAVIGATION_BAR");
+                    mContext.sendBroadcast(test1);
+                    break;
+                case MSG_HIDE_NAVIGATIONBAR:
+		    Intent test2 = new Intent("android.intent.action.HIDE_NAVIGATION_BAR");
+                    mContext.sendBroadcast(test2);
+                    Log.d(TAG, "yjr MSG_HIDE_NAVIGATIONBAR");
+                    break;
             }
         }
     }
@@ -530,6 +543,10 @@ public class DisplayPolicy {
                             }
                             checkAltBarSwipeForTransientBars(ALT_BAR_TOP);
                         }
+                        Log.d(TAG, "yjr pwm onSwipeFromTop");
+                        mHandler.removeMessages(MSG_HIDE_NAVIGATIONBAR);
+			            mHandler.removeMessages(MSG_SHOW_NAVIGATIONBAR);
+                        mHandler.sendEmptyMessageDelayed(MSG_SHOW_NAVIGATIONBAR,200);
                     }
 
                     @Override
@@ -541,6 +558,10 @@ public class DisplayPolicy {
                             }
                             checkAltBarSwipeForTransientBars(ALT_BAR_BOTTOM);
                         }
+                        Log.d(TAG, "yjr pwm onSwipeFromBottom");
+                        mHandler.removeMessages(MSG_HIDE_NAVIGATIONBAR);
+                        mHandler.removeMessages(MSG_SHOW_NAVIGATIONBAR);
+                        mHandler.sendEmptyMessageDelayed(MSG_SHOW_NAVIGATIONBAR,200);
                     }
 
                     @Override
@@ -609,6 +630,9 @@ public class DisplayPolicy {
                         if (listener != null) {
                             listener.onTouchEnd();
                         }
+                        Log.d(TAG, "yjr pwm onUpOrCancel----------");
+                        mHandler.removeMessages(MSG_HIDE_NAVIGATIONBAR);
+                        mHandler.sendEmptyMessageDelayed(MSG_HIDE_NAVIGATIONBAR, 5000);
                     }
 
                     @Override
相关推荐
乡野码圣1 小时前
【RK3588 Android12】开发效率提升技巧
android·嵌入式硬件
eybk2 小时前
Beeware生成安卓apk取得系统tts语音朗读例子
android
zhangphil3 小时前
Android图像显示,CPU的Skia与GPU的Vulkan高性能渲染系统
android
故事不长丨4 小时前
安卓相机开发:Camera、Camera2与CameraX的使用对比及选型指南
android·相机·camera·camerax·camera2·移动设备·相机开发
_李小白4 小时前
【Android 美颜相机】第七天:GLTextureView 解析
android·数码相机
honortech4 小时前
Android studio中配置gradle和对应的AGP版本
android·ide·android studio
廋到被风吹走4 小时前
【数据库】【MySQL】事务隔离深度解析:MVCC 实现与幻读解决机制
android·数据库·mysql
AC赳赳老秦4 小时前
技术文档合著:DeepSeek辅助多人协作文档的风格统一与内容补全
android·大数据·人工智能·微服务·golang·自动化·deepseek