【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
相关推荐
lizhenjun11418 小时前
android修改线程名字长度
android
用户69371750013841 天前
Google 正在“收紧侧加载”:陌生 APK 安装或需等待 24 小时
android·前端
用户69371750013841 天前
Room 3.0:这次不是升级,是重来
android·前端·google
alexhilton1 天前
Compose中的ContentScale:终极可视化指南
android·kotlin·android jetpack
Digitally1 天前
2026 年 8 款安卓数据擦除软件和应用对比
android
杨忆1 天前
android 11以上 截图工具类
android
粤M温同学1 天前
Android Studio 中安装 CodeBuddy AI助手
android·ide·android studio
阿拉斯攀登1 天前
【RK3576 安卓 JNI/NDK 系列 08】RK3576 实战(二):JNI 调用 I2C 驱动读取传感器数据
android·安卓ndk入门·jni方法签名·java调用c++·rk3576底层开发·rk3576 i2c开发
赶路人儿1 天前
常见的mcp配置
android·adb
符哥20081 天前
充电桩 WiFi 局域网配网(Android/Kotlin)流程、指令及实例说明文档
android·开发语言·kotlin