RK3566RK3568安卓11隐藏状态栏带接口

文章目录

  • 前言
  • 一、创建全局变量
  • 二、设置应用添加隐藏导航栏按钮
  • 三、添加按钮功能
  • 四、动态隐藏还有显示功能
  • 五、创建系统导航栏广播接口
  • 总结


前言

关于Android系统的状态栏,不同的客户有不同的需求: 有些客户需要永久隐藏状态栏,有些客户需要在设置显示中添加按钮可自行选择是否显示和隐藏,有些客户需要给出调用接口供APP去调用设置等;


一、创建全局变量

1、创建全局变量并保存状态栏状态,是为了系统级应用和整个框架层都能获取到该变量值,该变量值在掉电或者重启都不会丢失(除了恢复出厂设置Q 或者重刷系统固件之外) ;

2、创建全局变量
配置路径: frameworks/base/core/java/android/provider/Settings.java
定义了一个SYSTEM_HIDE_STATUS_BAR 全局变量: SYSTEM_HIDE_STATUS_BAR = “hide_status_bar”
这个是需要放在 public static final class System extends NameValueTable {
里面的哦

/**
* add by LQX at 20240116
*/
public static final String SYSTEM_HIDE_STATUS_BAR = "hide_status_bar";

3、定义全局变量的默认值
配置路径: frameworks/base/packages/SettingsProvider/res/values/defaults.xml
设置引用的名称格式为: def_ + SYSTEM_HIDE_STATUS_BAR 的字符值 = def_hide_status_bar,值为bool类型;
值为true: 隐藏状态栏;
值为false: 显示状态栏;

<!-- add by LQX --><bool name="def_hide_status_bar">false</bool>
<!-- end, add by LQX -->

二、设置应用添加隐藏导航栏按钮

1、在 设置->显示 里添加导航栏按钮;
2、按钮标题为“隐藏导航栏”
这里以英文和中文字体为例,其他字体需要的话也同理添加;
英文字体(系统为英文语言时显示) : packages/apps/Settings/res/values/strings.xml

<!-- add by LQX-->
<string name="hide_status_bar">Hide Status Bar</string>
<!-- end, add by LQX-->

中文字体: packages/apps/Settings/res/values-zh-rCN/strings.xml

<!-- add by LQX-->
<string name="hide_status_bar">隐藏状态栏</string>
<!-- end, add by LQX-->

3、添加按钮布局
(1) 选择在 设置->显示 里面添加
对应的布局文件: packages/apps/Settings/res/xml/display_settings.xml
对应的按钮类型,这里选择为: SwitchPreference

(2)在对应的位置添加按钮控件
这里选择是在“屏幕超时”后面添加:
android:key=“hide_status_bar” ===>按钮控制健值
android:title=“@string/hide_status_bar”= = >标题,使用上面2中配置好的

<!-- add by LQX--><SwitchPreferenceandroid:key="hide_status_bar"android:title="@string/hide_status_bar" /><!-- end,add by LQX-->

4、这样按钮就能在 设置->显示 中,显示出来了
但此时点击按钮是没有作用的,对应的按钮功能还没有添加进去:

在这里插入图片描述

三、添加按钮功能

1、添加功能代码
创建一个java文件:
目录路径: packages/apps/Settings/src/com/android/settings/display/
创建一个java文件: HideStatusBarPreferenceController
功能代码如下:

package com.android.settings.display;import android.content.Context;
import android.provider.Settings;
import androidx.preference.SwitchPreference;
import androidx.preference.Preference;import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import android.content.Intent;
import android.util.Log;public class HideStatusBarPreferenceController extends AbstractPreferenceController implementsPreferenceControllerMixin, Preference.OnPreferenceChangeListener {private static final String TAG = "HideStatusBar";private static final boolean DEBUG = true;private static final String KEY_HIDE_STATUS_BAR = "hide_status_bar";public static final String ACTION_HIDE_STATUS_BAR = "action.ACTION_HIDE_STATUS_BAR";public HideStatusBarPreferenceController(Context context) {super(context);}@Overridepublic String getPreferenceKey() {return KEY_HIDE_STATUS_BAR;}@Overridepublic boolean isAvailable() {return true;}@Overridepublic void updateState(Preference preference) {int value = Settings.System.getInt(mContext.getContentResolver(), Settings.System.SYSTEM_HIDE_STATUS_BAR, 0);((SwitchPreference) preference).setChecked(value != 0);}@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {boolean value = (Boolean) newValue;if(DEBUG) {Log.d(TAG, "key value " + value);}Settings.System.putInt(mContext.getContentResolver(), Settings.System.SYSTEM_HIDE_STATUS_BAR, value ? 1 : 0);Intent intent = new Intent(ACTION_HIDE_STATUS_BAR);mContext.sendBroadcast(intent); //发送广播return true;}
}

四、动态隐藏还有显示功能

1、相关修改代码文件:

frameworks/base/packages/SystemUI\src\com/android/systemui/statusbar/phone/StatusBar.java
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java

2、主要修改代码
路径:frameworks/base/packages/SystemUl/src/com/android/systemui/lstatusbar/phone/StatusBar.java

--- 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
@@ -259,6 +259,8 @@ public class StatusBar extends SystemUI implements DemoMode,public static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";static public final String SYSTEM_DIALOG_REASON_SCREENSHOT = "screenshot";+	public static final String ACTION_HIDE_STATUS_BAR = "action.ACTION_HIDE_STATUS_BAR"; //add by LQX
+	private static final String BANNER_ACTION_CANCEL ="com.android.systemui.statusbar.banner_action_cancel";private static final String BANNER_ACTION_SETUP =
@@ -1099,7 +1101,20 @@ public class StatusBar extends SystemUI implements DemoMode,mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager);mNotificationLogger.setHeadsUpManager(mHeadsUpManager);//createNavigationBar(result);
+       setStatusBar(); //add by LQX开机设置状态栏栏状态
+if (ENABLE_LOCKSCREEN_WALLPAPER && mWallpaperSupported) {mLockscreenWallpaper = mLockscreenWallpaperLazy.get();
@@ -1288,6 +1303,7 @@ 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(ACTION_HIDE_STATUS_BAR); //add by LQX接收设置应用发送出来的广播mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL);}@@ -1362,6 +1378,45 @@ public class StatusBar extends SystemUI implements DemoMode,}}
+//add by LQX
+private void setStatusBar() {
+            boolean hideStatusBar = Settings.System.getInt(mContext.getContentResolver(),Settings.System.SYSTEM_HIDE_STATUS_BAR,0) != 0;
++                   if(hideStatusBar)+                  hideStatusBar();+         else{+                showStatusBar();+           }+  }
++              private void showStatusBar() {+              if (mPhoneStatusBarWindow!=null){+                     Log.d(TAG,"====== show StatusBar ======");+                               mPhoneStatusBarWindow.setVisibility(View.VISIBLE);+               }+      }
++           private void hideStatusBar() {+              if (mPhoneStatusBarWindow != null){+                     Log.d(TAG,"====== hide StatusBar ======");+                    mPhoneStatusBarWindow.setVisibility(View.GONE);+               }+      }
+//end,add by LQX
+// TODO(b/117478341): This was left such that CarStatusBar can override this method.// Try to remove this.
@@ -2804,6 +2862,10 @@ public class StatusBar extends SystemUI implements DemoMode,}else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) {mQSPanel.showDeviceMonitoringDialog();
+            } 
+			else if(ACTION_HIDE_STATUS_BAR.equals(action)) {
+                setStatusBar();
+           }}}};

4、现在系统默认是隐藏导航栏,如需默认隐藏状态栏,请按下面的设置即可
文件:frameworks/base/packages/SettingsProvider/res/values/defaults.xm
值为true: 隐藏状态栏:
值为false: 显示状态栏

<bool name="def_hide_status_bar">true</bool>

五、创建系统导航栏广播接口

1、定义导航栏显示与隐藏的广播

    public static final String ACTION_API_HIDE_STATUS_BAR = "action.ACTION_API_HIDE_STATUS_BAR"; //add by LQX 隐藏状态栏广播public static final String ACTION_API_SHOW_STATUS_BAR = "action.ACTION_API_SHOW_STATUS_BAR"; //add by LQX 显示状态栏广播

2、系统代码实现
文件路径:frameworks/base/packages/SystemUl/src/com/android/systemui/statusbar/phone/StatusBar.java
创建了两个接收广播,待应用发送这两个广播来实现导航栏隐藏和显示;

--- 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
@@ -259,6 +259,10 @@ public class StatusBar extends SystemUI implements DemoMode,public static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";static public final String SYSTEM_DIALOG_REASON_SCREENSHOT = "screenshot";public static final String ACTION_HIDE_NAVIGATION = "action.ACTION_HIDE_NAVIGATION"; //add by LQX
+       public static final String ACTION_API_HIDE_STATUS_BAR = "action.ACTION_API_HIDE_STATUS_BAR"; //add by LQX 隐藏状态栏广播
+       public static final String ACTION_API_SHOW_STATUS_BAR = "action.ACTION_API_SHOW_STATUS_BAR"; //add by LQX 显示状态栏广播
+       private static final String BANNER_ACTION_CANCEL ="com.android.systemui.statusbar.banner_action_cancel";
@@ -1288,6 +1305,9 @@ 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(ACTION_HIDE_NAVIGATION); //add by LQX
+        filter.addAction(ACTION_API_HIDE_STATUS_BAR); //add by LQX 添加到广播队列里
+        filter.addAction(ACTION_API_SHOW_STATUS_BAR); //add by LQX 添加到广播队列里mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL);}// TODO(b/117478341): This was left such that CarStatusBar can override this method.// Try to remove this.protected void createNavigationBar(@Nullable RegisterStatusBarResult result) {
@@ -2804,7 +2878,19 @@ public class StatusBar extends SystemUI implements DemoMode,}else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) {mQSPanel.showDeviceMonitoringDialog();}  else if(ACTION_HIDE_STATUS_BAR.equals(action)) {setStatusBar();}
+            else if(ACTION_API_HIDE_STATUS_BAR.equals(action)) {
+               hideStatusBar(); //隐藏状态栏
+         }
+        else if(ACTION_API_SHOW_STATUS_BAR.equals(action)) {
+           showStatusBar(); //显示状态栏
+      }}

总结

教程结束!编译成功后可以先用adb测试:
PS:对了!踩到的坑,改了系统api需要更新

make update-api

adb shell

am broadcast -a "action.ACTION_API_SHOW_STATUS_BAR"
am broadcast -a "action.ACTION_API_HIDE_STATUS_BAR"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/410269.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF 文档解除密码

PDF 文档解除密码 1. 文件 -> 文档属性 -> 安全 -> 文档限制摘要2. PDF365References 1. 文件 -> 文档属性 -> 安全 -> 文档限制摘要 密码保护《算法设计与分析基础_第3版.pdf》 2. PDF365 https://www.pdf365.cn/ 免费功能 -> PDF 去密码 开始去除 Re…

计算机网络-NAT网络地址转换

今天来回顾下之前所学的知识&#xff0c;将它们串联起来进行巩固。一开始了解了IP编址进行IP设置和划分网段&#xff1b;学习了二层以太网交换&#xff0c;了解了二层通信基础&#xff1b;学习了路由基础知识&#xff0c;大致了解到了路由是什么&#xff1f;静态路由和动态路由…

“具身智能”浪潮中,达闼机器人的商业化“奇点”已然到来?

当前&#xff0c;人形机器人产业正在快速发展&#xff0c;而2023年必将会是载入史册的一年。 具体来看&#xff0c;2023年&#xff0c;AI技术大爆发&#xff0c;可在语言、视觉、运动控制、降低研发成本等多方面赋能人形机器人产业发展。与此同时&#xff0c;特斯拉、波士顿动…

如何用AI提高论文阅读效率?

已经2024年了&#xff0c;该出现一个写论文解读AI Agent了。 大家肯定也在经常刷论文吧。 但真正尝试过用GPT去刷论文、写论文解读的小伙伴&#xff0c;一定深有体验——费劲。其他agents也没有能搞定的&#xff0c;今天我发现了一个超级厉害的写论文解读的agent &#xff0c…

利用docker的LNMP

目录 服务器环境 任务需求 服务搭建 Nginx Mysql Php 启动 wordpress 服务 服务器环境 容器 操作系统 IP地址 主要软件 nginx CentOS 7 172.20.0.10 Docker-Nginx mysql CentOS 7 172.20.0.20 Docker-Mysql php CentOS 7 172.2…

Lazada不懂英文能做吗?Lazada国内店铺好做吗?-站斧浏览器

Lazada不懂英文可以做吗&#xff1f; Lazada作为一个国际化的电商平台&#xff0c;为了方便用户来自不同国家和地区的购物需求&#xff0c;提供了多语言支持。对于不懂英文的用户来说&#xff0c;他们同样可以在Lazada上进行购物。 首先&#xff0c;Lazada平台上的界面和商品…

爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数

爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数 豆瓣电影网址&#xff1a;https://movie.douban.com/top250 主页截图和要抓取的内容如下图&#xff1a; 分析&#xff1a; 第一页的网址&#xff1a;https://movie.douban.com/top250?start0&filter 第二页的…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -关于我们页面实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

Shell脚本同时调用#!/bin/bash和#!/usr/bin/expect

如果你想在一个脚本中同时使用bash和expect&#xff0c;你可以将expect部分嵌入到bash脚本中。以下是一个示例&#xff1a; #!/bin/bash# 设置MySQL服务器地址、端口、用户名和密码 MYSQL_HOST"localhost" MYSQL_PORT"3306" MYSQL_USER"your_usernam…

【实战记录】 vagrant+virtualbox+docker 轻松用虚拟机集成组件

用途 最近要学一大堆组件&#xff0c;不想直接安装本机上&#xff0c;然后gpt说&#xff1a;你可以用vagrant起个虚拟机&#xff08;然后docker拉取各种组件的镜像&#xff09;&#xff1b;或者k8s 实战的整体思路 首先安装virtualbox和vagrant。然后cmd依次键入三条命令 安…

powershell脚本 判断NLB是否已安装

bat脚本&#xff1a;456.bat REM REM 解决下载的时候字符乱码的问题 chcp 65001 echo offREM 管理员运行powershell脚本 PUSHD %~DP0 & cd /d "%~dp0" %1 %2 mshta vbscript:createobject("shell.application").shellexecute("%~s0","…

通过OpenIddict设计一个授权服务器02-创建asp.net项目

在这一部分中&#xff0c;我们将创建一个ASPNET核心项目&#xff0c;作为我们授权服务器的最低设置。我们将使用MVC来提供页面&#xff0c;并将身份验证添加到项目中&#xff0c;包括一个基本的登录表单。 创建一个空的asp.net core项目 正如前一篇文章中所说&#xff0c;授权…