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

news2025/1/9 1:36:27

文章目录

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


前言

关于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-->
    <SwitchPreference
        android: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 implements
        PreferenceControllerMixin, 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);
    }

    @Override
    public String getPreferenceKey() {
        return KEY_HIDE_STATUS_BAR;
    }

    @Override
    public boolean isAvailable() {
        return true;
    }

    @Override
    public void updateState(Preference preference) {
        int value = Settings.System.getInt(
                mContext.getContentResolver(), Settings.System.SYSTEM_HIDE_STATUS_BAR, 0);
        ((SwitchPreference) preference).setChecked(value != 0);
    }

    @Override
    public 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.coloradmin.cn/o/1388646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙 ArkUI - 常用组件和布局

目录 一、组件 1.按钮 2.单选框 3.切换按钮 4.进度条 5.文本 6.文本输入框 二、布局方式 1.线性布局 2.层叠布局 3.弹性布局 4.网格布局 一、组件 ArkUI有丰富的内置组件&#xff0c;包括文本、按钮、图片、进度条、输入框、单选框、多选框等。我们还可以将基础组件…

装饰器模式介绍

目录 一、装饰器模式介绍 1.1 装饰器模式定义 1.2 装饰器模式原理 1.2.1 模式类图 1.2.2 模式角色说明 1.2.3 举例代码 二、装饰器模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 类图 2.2.2 类图说明 2.2.3 具体实现 2.2.3.1 DataLoader类 2.2.3.2 BaseFileDataLoa…

Spring使用注解管理Bean

引入lib包 Spring对Bean管理的常用注解 Component组件(作用在类上) Spring中提供了Component的三个衍生注解:(功能在目前为止是一致的) Controller WEB层 Service 业务层 Repository 持久层 属性注入的注解:(使用注解注入的方式,可以不用提供set方法) Value 用于注入普…

新增PostgreSQL数据库管理功能,1Panel开源面板v1.9.3发布

2024年1月15日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.9.3版本。 在这一版本中&#xff0c;1Panel新增了PostgreSQL数据库管理功能&#xff0c;并且支持设置PHP运行环境扩展模版。此外&#xff0c;我们进行了30多项功能更新和问题修复。1Panel应用…

6个免费好用的 PDF 文件加密软件 [Windows Mac]

加密 PDF 文件使您能够保护它们免受未经授权的访问。当重要信息处于危险之中时&#xff0c;黑客可以访问电子文档。 考虑到它们很容易被黑客入侵&#xff0c;您需要迅速采取行动。避免这种情况的方法之一是使用更适合您需要的 PDF 加密软件。 有很多选项可供选择&#xff0c;…

Linux中DCHP与时间同步

目录 一、DHCP &#xff08;一&#xff09;工作原理 1.获取 2.续约 &#xff08;二&#xff09;分配方式 &#xff08;三&#xff09;服务器配置 1.随机地址分配 2.固定地址分配 二、时间同步 &#xff08;一&#xff09;ntpdate &#xff08;二&#xff09;chrony …

智云谷再获资本市场青睐,完成数千万元A+轮融资

近日&#xff0c;深圳前海智云谷科技有限公司&#xff08;以下简称“智云谷”&#xff09;完成数千万元A轮融资&#xff0c;本轮融资由青松基金独家投资&#xff0c;多维资本担任独家融资财务顾问。本轮融资资金将用于扩大新技术研发投入、智能工厂扩产、加速产品交付&#xff…

openpose环境搭建

编程如画&#xff0c;我是panda&#xff01; 最近学习要用要openpose&#xff0c;配了三天的环境&#xff0c;快疯了&#xff0c;踩了很多坑&#xff0c;在这里和大家分享一下 目录 前言 一、安装openpose 二、运行openpose 三、常见的两个错误 1. No module named pyopen…

深度学习论文解读分享之diffGrad:一种卷积神经网络优化方法

IEEE TNNLS 2020&#xff1a;diffGrad: 一种卷积神经网络优化方法 题目 diffGrad: An Optimization Method for Convolutional Neural Networks 作者 Shiv Ram Dubey , Member, IEEE, Soumendu Chakraborty , Swalpa Kumar Roy , Student Member, IEEE, Snehasis Mukherjee…

leetcode234. 回文链表

题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;hea…

西米支付:到底什么是NFT(数字藏品支付通道)(NFT支付通道)

NFT到底指的是什么呢&#xff1f; 数字藏品的实际意义在于它们打破了传统艺术品的物质形态束缚。数字藏品可以通过虚拟现实和区块链技术进行创作、展示和交易。它们不仅可以满足人们对艺术品的审美需求&#xff0c;还可以成为一种投资和资产保值增值的方式。数字藏品的实际意义…

线控底盘新玩家凶猛!这家企业的ONE-BOX产品正式量产下线

高工智能汽车获悉&#xff0c;12月27日&#xff0c;威肯西科技宣布旗下ONE-BOX线控制动产品--液压解耦制动系统HDBS实现量产下线。该产品将与多个汽车品牌签署量产及定点协议&#xff0c;预计年产量达到60万套。 据了解&#xff0c;作为耀宁科技集团的一级子公司&#xff0c;威…

Javascript 下载方法分享

一、引言 JavaScript是一种广泛使用的编程语言&#xff0c;用于增强网页交互性和动态功能。然而&#xff0c;有时我们需要将JavaScript代码下载并部署到本地服务器或离线环境中。本文将分享一些常用的JavaScript下载方法。 二、直接下载JavaScript文件 手动下载&#xff1a;…

机器学习-决策树

1、什么是决策树&#xff1f; 一种描述概念空间的有效的归纳推理办法。基于决策树的学习方法可以进行不相关的多概念学习&#xff0c;具有简单快捷的优势&#xff0c;已经在各个领域取得广泛应用。 决策树是一种树型结构&#xff0c;其中每个内部结点表示在一个属性上的测试&a…

徐州数字孪生元宇宙赋能工业智能制造,助力传统制造业数字化转型

徐州数字孪生元宇宙赋能工业智能制造&#xff0c;助力传统制造业数字化转型。在徐州市制造业企业数字化转型的过程中&#xff0c;数字孪生技术的应用已经取得了显著成效。一方面&#xff0c;企业的生产效率得到了显著提高&#xff0c;产品质量也得到了有效保障。另一方面&#…

项目管理中,怎么进行项目过程管理?

项目经理在项目管理中会遇到许多问题&#xff0c;其中最令人头痛的莫过于项目计划执行不到位&#xff0c;进度难以跟踪&#xff0c;项目延期严重。这些问题导致项目计划看似存在&#xff0c;但实际上与无计划相差无几。 对于项目团队内部&#xff0c;项目经理常常抱怨团队成员…

Java后端sql编写

Java后端sql编写 注意事项二级目录三级目录 注意事项 在后端编写sql&#xff0c;不要直接编写sql语句进行查询 比如直接在service实现类中写下图这种语句 二级目录 三级目录

thinkphp 命令行执行

1 php 1 which php 查看命令来源 2 ll /usr/bin/php 软连接&#xff0c;来源是php的安装文件的可执行文件php 3 $PATH的作用, 显示当前PATH环境变量,该变量的值由一系列以冒号分隔的目录名组成如下&#xff0c; echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/…

贴纸SDK多少钱?

贴纸已经成为了表达自我、分享情感的重要工具,美摄科技&#xff0c;作为一家领先的技术解决方案提供商&#xff0c;致力于为企业提供卓越的贴纸SDK&#xff08;软件开发工具包&#xff09;技术解决方案。本文将深入探讨美摄科技贴纸SDK的价值、优势以及如何为企业创造价值。 一…

K8S----YAML

kubernetes中资源可以使用YAML描述&#xff08;如果您对YAML格式不了解&#xff0c;可以参考YAML语法&#xff09;&#xff0c;也可以使用JSON。其内容可以分为如下四个部分&#xff1a; typeMeta&#xff1a;对象类型的元信息&#xff0c;声明对象使用哪个API版本&#xff0c…