Android13 動(dòng)態(tài)控制狀態(tài)欄和導(dǎo)航欄

前言

在Android系統(tǒng)中,狀態(tài)欄(StatusBar)贝咙、導(dǎo)航欄(NavigationBar)以及下拉菜單(通常稱為Notification Shade或Quick Settings Panel)構(gòu)成了用戶界面不可或缺的三個(gè)元素亚斋,它們共同為用戶提供了豐富的信息顯示與便捷的交互體驗(yàn)作媚。具體而言,狀態(tài)欄實(shí)時(shí)展示著時(shí)間帅刊、電池電量纸泡、信號(hào)強(qiáng)度等關(guān)鍵信息;導(dǎo)航欄則集成了如返回赖瞒、主頁及多任務(wù)管理等基礎(chǔ)操作按鈕女揭;而下拉菜單則讓用戶能夠迅速訪問快速設(shè)置項(xiàng)及通知詳情蚤假。

值得注意的是,盡管這些元素在多數(shù)Android設(shè)備上普遍存在且至關(guān)重要吧兔,但并非所有用戶或應(yīng)用場景都需要它們持續(xù)顯示磷仰。因此,Android系統(tǒng)提供了靈活的配置選項(xiàng)境蔼,允許用戶或開發(fā)者根據(jù)實(shí)際需求控制這些元素的顯示與隱藏狀態(tài)灶平。

在Android 13中,對(duì)于導(dǎo)航欄的動(dòng)態(tài)顯示與隱藏控制相較于之前版本有了更為簡化的處理方式箍土。通過利用廣播機(jī)制或其他系統(tǒng)接口逢享,開發(fā)者可以更加便捷地實(shí)現(xiàn)這些高級(jí)定制功能,為用戶帶來更加個(gè)性化和流暢的使用體驗(yàn)吴藻。同時(shí)瞒爬,這也意味著Android平臺(tái)在持續(xù)優(yōu)化其靈活性和可定制性,以更好地滿足不同用戶群體的多樣化需求了调缨。

修改示例

diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
old mode 100644
new mode 100755
index 5c8d2212cef..ffd22dc73b1
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
@@ -496,4 +496,15 @@ public class NavigationBarController implements
             mNavigationBars.valueAt(i).dump(pw);
         }
     }
+
+    /**
+     * Create by yeruilai 2024-8-22 10:23:59 
+     */
+    public void removeNavigationBars() {
+        Display[] displays = mDisplayManager.getDisplays();
+        for (Display display : displays) {
+            removeNavigationBar(display.getDisplayId());
+        }
+    }
+
 }
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
index f76470badf1..94cca11834b 100755
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -286,6 +286,15 @@ import dagger.Lazy;
 public class CentralSurfacesImpl extends CoreStartable implements
         CentralSurfaces {
 
+    // Create by yeruilai 2024-8-22 10:19:38 Dynamically display hidden navigation bar and status bar
+    private static final String ACTION_HIDE_STATUS_BAR = "com.systemui.statusbar.hide";
+    private static final String ACTION_SHOW_STATUS_BAR = "com.systemui.statusbar.show";
+    private static final String SYS_PROPERTY_STATUS_BAR = "persist.sys.statusbar.enable";
+    private static final String ACTION_HIDE_NAVIGATION_BAR = "com.systemui.navigationbar.hide";
+    private static final String ACTION_SHOW_NAVIGATION_BAR = "com.systemui.navigationbar.show";
+    private static final String SYS_PROPERTY_NAVIGATION_BAR = "persist.sys.navigationbar.enable";
+    
     private static final String BANNER_ACTION_CANCEL =
             "com.android.systemui.statusbar.banner_action_cancel";
     private static final String BANNER_ACTION_SETUP =
@@ -1522,6 +1531,12 @@ public class CentralSurfacesImpl extends CoreStartable implements
             filter.addAction(UnisocPowerManagerUtil.ACTION_POWEREX_SAVE_MODE_CHANGED);
         }
         /* @} */
+        // Create by yeruilai 2024-8-22 10:19:38 Dynamically display hidden navigation bar and status bar
+        filter.addAction(ACTION_HIDE_STATUS_BAR);
+        filter.addAction(ACTION_SHOW_STATUS_BAR);
+        filter.addAction(ACTION_HIDE_NAVIGATION_BAR);
+        filter.addAction(ACTION_SHOW_NAVIGATION_BAR);
+
         mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL);
     }
 
@@ -2543,8 +2558,8 @@ public class CentralSurfacesImpl extends CoreStartable implements
     @Override
     public void createAndAddWindows(@Nullable RegisterStatusBarResult result) {
         makeStatusBarView(result);
-        mNotificationShadeWindowController.attach();
         mStatusBarWindowController.attach();
+        mNotificationShadeWindowController.attach();
     }
 
     // called by makeStatusbar and also by PhoneStatusBarView
@@ -2870,6 +2885,29 @@ public class CentralSurfacesImpl extends CoreStartable implements
                     && mDataSaverController.isDataSaverEnabled()) {
                 mDataSaverController.setDataSaverEnabled(false);
             }
+            // Create by yeruilai 2024-8-22 10:19:38 Dynamically display hidden navigation bar and status bar
+             else if(ACTION_HIDE_STATUS_BAR.equals(action)){
+                android.util.Log.d("yeruilai","yeruilai:action=" + ACTION_HIDE_STATUS_BAR);
+
+                mStatusBarWindowController.hideStatusBar();
+                SystemProperties.set(SYS_PROPERTY_STATUS_BAR, "false");
+            } else if(ACTION_SHOW_STATUS_BAR.equals(action)){
+                android.util.Log.d("yeruilai","yeruilai:action=" + ACTION_SHOW_STATUS_BAR);
+
+                mStatusBarWindowController.showStatusBar();
+                SystemProperties.set(SYS_PROPERTY_STATUS_BAR, "true");
+            } else if(ACTION_HIDE_NAVIGATION_BAR.equals(action)){
+                android.util.Log.d("yeruilai","yeruilai:action=" + ACTION_HIDE_NAVIGATION_BAR);
+
+                mNavigationBarController.removeNavigationBars();
+                SystemProperties.set(SYS_PROPERTY_NAVIGATION_BAR, "false");
+            } else if(ACTION_SHOW_NAVIGATION_BAR.equals(action)){
+                android.util.Log.d("yeruilai","yeruilai:action=" + ACTION_SHOW_NAVIGATION_BAR);
+
+                createNavigationBar(null);
+                SystemProperties.set(SYS_PROPERTY_NAVIGATION_BAR, "true");
+            }
+
             /* @} */
             Trace.endSection();
         }
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
old mode 100644
new mode 100755
index e0d780a5fcd..08b4628f4c5
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
@@ -316,4 +316,42 @@ public class StatusBarWindowController {
             mLpChanged.privateFlags &= ~PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR;
         }
     }
+
+    /**
+     * Create by yeruilai 2024-8-22 10:23:59 
+     */
+    private void apply(State state,boolean isHideStatus) {
+        if (!mIsAttached) {
+            return;
+        }
+        applyForceStatusBarVisibleFlag(state);
+        if (!isHideStatus){
+            applyHeight(state);
+        }
+        if (mLp != null && mLp.copyFrom(mLpChanged) != 0) {
+            mWindowManager.updateViewLayout(mStatusBarWindowView, mLp);
+        }
+    }
+
+    /**
+     * Create by yeruilai 2024-8-22 10:23:59 
+     */
+    public void showStatusBar(){
+        apply(mCurrentState);
+        mStatusBarWindowView.setVisibility(View.VISIBLE);
+    }
+
+    /**
+     * Create by yeruilai 2024-8-22 10:23:59 
+     */
+    public void hideStatusBar(){
+        mStatusBarWindowView.setVisibility(View.GONE);
+        mLpChanged.height = 0;
+        for (int rot = Surface.ROTATION_0; rot <= Surface.ROTATION_270; rot++) {
+            mLpChanged.paramsForRotation[rot].height = 0;
+        }
+        apply(mCurrentState,true);
+    }
+
 }

添加相應(yīng)的SELinux權(quán)限疮鲫,代碼示例如下:

diff --git a/system/sepolicy/public/platform_app.te b/system/sepolicy/public/platform_app.te
index 3f689d82481..21a1f30d29f 100755
--- a/system/sepolicy/public/platform_app.te
+++ b/system/sepolicy/public/platform_app.te
@@ -7,3 +7,5 @@ allow platform_app system_app_data_file:dir r_dir_perms;
 allow platform_app system_app_data_file:file r_file_perms;
 #redstone
 type platform_app, domain;
+
+allow platform_app system_prop:property_service set;
+
diff --git a/system/sepolicy/prebuilts/api/33.0/public/platform_app.te b/system/sepolicy/prebuilts/api/33.0/public/platform_app.te
index 3f689d82481..21a1f30d29f 100755
--- a/system/sepolicy/prebuilts/api/33.0/public/platform_app.te
+++ b/system/sepolicy/prebuilts/api/33.0/public/platform_app.te
@@ -7,3 +7,5 @@ allow platform_app system_app_data_file:dir r_dir_perms;
 allow platform_app system_app_data_file:file r_file_perms;
 #redstone
 type platform_app, domain;
+
+allow platform_app system_prop:property_service set;
+
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弦叶,隨后出現(xiàn)的幾起案子俊犯,更是在濱河造成了極大的恐慌,老刑警劉巖伤哺,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燕侠,死亡現(xiàn)場離奇詭異,居然都是意外死亡立莉,警方通過查閱死者的電腦和手機(jī)绢彤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜓耻,“玉大人茫舶,你說我怎么就攤上這事∩蔡剩” “怎么了饶氏?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長有勾。 經(jīng)常有香客問我疹启,道長,這世上最難降的妖魔是什么蔼卡? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任喊崖,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荤懂。我一直安慰自己茁裙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布势誊。 她就那樣靜靜地躺著呜达,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粟耻。 梳的紋絲不亂的頭發(fā)上查近,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音挤忙,去河邊找鬼霜威。 笑死,一個(gè)胖子當(dāng)著我的面吹牛册烈,可吹牛的內(nèi)容都是我干的戈泼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼赏僧,長吁一口氣:“原來是場噩夢啊……” “哼大猛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淀零,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤挽绩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后驾中,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唉堪,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年肩民,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唠亚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡持痰,死狀恐怖灶搜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情工窍,我是刑警寧澤占调,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站移剪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏薪者。R本人自食惡果不足惜纵苛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧攻人,春花似錦取试、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蓬坡,卻和暖如春猿棉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屑咳。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工萨赁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兆龙。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓杖爽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親紫皇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慰安,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容