【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
相关推荐
独行soc1 小时前
2026年渗透测试面试题总结-20(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
常利兵1 小时前
2026年,Android开发已死?不,它正迎来黄金时代!
android
Risehuxyc1 小时前
备份三个PHP程序
android·开发语言·php
Doro再努力11 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
Daniel李华11 小时前
echarts使用案例
android·javascript·echarts
做人不要太理性12 小时前
CANN Runtime 运行时组件深度解析:任务调度机制、存储管理策略与维测体系构建逻辑
android·运维·魔珐星云
我命由我1234513 小时前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
朗迹 - 张伟13 小时前
Tauri2 导出 Android 详细教程
android
lpruoyu14 小时前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习
独自破碎E15 小时前
【BISHI15】小红的夹吃棋
android·java·开发语言