当前位置: 首页 > news >正文

MTK Android13 霸屏实现

一、背景

在台式POS场景下,经常有应用会需要获取霸屏的权限,隐藏状态栏或者导航栏,且不能被划出,其实系统已经系统了隐藏状态栏也导航栏的接口,但是无法做到禁止滑出。

View decorView = ((Activity) context).getWindow().getDecorView();int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;decorView.setSystemUiVisibility(uiOptions);

二、霸屏实现

通过广播形式实现:

1.在systemui中增加广播定义

diff --git a/vendor/mediatek/proprietary/packages/apps/SystemUI/AndroidManifest.xml b/vendor/mediatek/proprietary/packages/apps/SystemUI/AndroidManifest.xml
index 6420244..9dab3d4 100644
--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/AndroidManifest.xml
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/AndroidManifest.xml
@@ -342,6 +342,12 @@<protected-broadcast android:name="com.android.settingslib.action.UNREGISTER_SLICE_RECEIVER" /><protected-broadcast android:name="com.android.settings.flashlight.action.FLASHLIGHT_CHANGED" />+    <protected-broadcast android:name="com.systemui.statusbar.show" />
+    <protected-broadcast android:name="com.systemui.statusbar.hide" />
+
+    <protected-broadcast android:name="com.systemui.navigationbar.show" />
+    <protected-broadcast android:name="com.systemui.navigationbar.hide" />
+<applicationandroid:name=".SystemUIApplication"android:persistent="true"

2.增加广播的监听

diff --git a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
index a853747..70d1586 100644
--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -287,6 +287,13 @@ public class CentralSurfacesImpl extends CoreStartable implementsprivate static final int MSG_LAUNCH_TRANSITION_TIMEOUT = 1003;// 1020-1040 reserved for BaseStatusBar+
+    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 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_STATUS_BAR = "persist.sys.statusbar.enable";
+    private static final String SYS_PROPERTY_NAVIGATION_BAR = "persist.sys.navigationbar.enable";/*** The delay to reset the hint text when the hint animation is finished running.*/
@@ -969,6 +976,10 @@ public class CentralSurfacesImpl extends CoreStartable implementscreateAndAddWindows(result);+        if (!SystemProperties.getBoolean(SYS_PROPERTY_STATUS_BAR, false)) {
+            mStatusBarWindowController.setBarVisibility(View.GONE);
+        }
+if (mWallpaperSupported) {// Make sure we always have the most current wallpaper info.IntentFilter wallpaperChangedFilter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED);
@@ -1216,7 +1227,9 @@ public class CentralSurfacesImpl extends CoreStartable implements}mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager);-        createNavigationBar(result);
+        if (SystemProperties.getBoolean(SYS_PROPERTY_NAVIGATION_BAR, false)) {
+            createNavigationBar(result);
+        }if (ENABLE_LOCKSCREEN_WALLPAPER && mWallpaperSupported) {mLockscreenWallpaper = mLockscreenWallpaperLazy.get();
@@ -1454,6 +1467,10 @@ public class CentralSurfacesImpl extends CoreStartable implementsIntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);filter.addAction(Intent.ACTION_SCREEN_OFF);
+        filter.addAction(ACTION_HIDE_NAVIGATION_BAR);
+        filter.addAction(ACTION_SHOW_NAVIGATION_BAR);
+        filter.addAction(ACTION_HIDE_STATUS_BAR);
+        filter.addAction(ACTION_SHOW_STATUS_BAR);mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL);}@@ -2729,6 +2746,18 @@ public class CentralSurfacesImpl extends CoreStartable implements}finishBarAnimations();resetUserExpandedStates();
+            } else if (ACTION_HIDE_NAVIGATION_BAR.equals(action)) {
+                mNavigationBarController.removeNavigationBars();
+                SystemProperties.set(SYS_PROPERTY_NAVIGATION_BAR, "false");
+            } else if (ACTION_SHOW_NAVIGATION_BAR.equals(action)) {
+                createNavigationBar(null);
+                SystemProperties.set(SYS_PROPERTY_NAVIGATION_BAR, "true");
+            } else if (ACTION_HIDE_STATUS_BAR.equals(action)) {
+                mStatusBarWindowController.setBarVisibility(View.GONE);
+                SystemProperties.set(SYS_PROPERTY_STATUS_BAR, "false");
+            } else if (ACTION_SHOW_STATUS_BAR.equals(action)) {
+                mStatusBarWindowController.setBarVisibility(View.VISIBLE);
+                SystemProperties.set(SYS_PROPERTY_STATUS_BAR, "true");}Trace.endSection();}

3.针对广播监听增加对应接口实现

diff --git a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
index d756af7..97a7744 100644
--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
@@ -353,6 +353,13 @@ public class NavigationBarController implements}}+    public void removeNavigationBars() {
+        Display[] displays = mDisplayManager.getDisplays();
+        for (Display display : displays) {
+            removeNavigationBar(display.getDisplayId());
+        }
+    }
+/** @see NavigationBar#checkNavBarModes() */public void checkNavBarModes(int displayId) {NavigationBar navBar = mNavigationBars.get(displayId);
diff --git a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
index e0d780a..beef9aa 100644
--- a/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
+++ b/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java
@@ -250,6 +250,10 @@ public class StatusBarWindowController {apply(mCurrentState);}+    public void setBarVisibility(int visibility) {
+        mStatusBarWindowView.setVisibility(visibility);
+    }
+/*** Sets whether an ongoing process requires the status bar to be forced visible.*

三、重新编译systemui,并测试

am broadcast -a com.systemui.statusbar.show   #状态显示
am broadcast -a com.systemui.statusbar.hide    #状态栏隐藏
am broadcast -a com.systemui.navigationbar.show #导航栏显示
am broadcast -a com.systemui.navigationbar.hide  #导航栏隐藏

注意广播需要root权限或者system权限,如果普通应用想具备此权限,需要修改广播的定义,大家可根据自己需求修改

http://www.lryc.cn/news/337716.html

相关文章:

  • PyTorch神经网络打印存储所有权重+激活值(运行时中间值)
  • grpc-教程(golang版)
  • Spring与Spring Boot的区别:从框架设计到应用开发
  • React Hooks 全解: 常用 Hooks 及使用场景详解
  • 第十三届蓝桥杯真题:x进制减法,数组切分,gcd,青蛙过河
  • JavaEE初阶Day 6:多线程(4)
  • 微信小程序 django+nodejs电影院票务售票选座系统324kd
  • 基于springboot实现桂林旅游景点导游平台管理系统【项目源码+论文说明】计算机毕业设计
  • idea 开发serlvet汽车租赁管理系统idea开发sqlserver数据库web结构计算机java编程layUI框架开发
  • Unity之PUN实现多人联机射击游戏的优化(Section 3)
  • PDF锐化
  • 【python和java】
  • C盘满了怎么办,清理工具TreeSize
  • 【vue】watch 侦听器
  • 校招生如何准备软件测试、测试开发岗位的面试?
  • 蓝桥杯抱佛脚篇~
  • 基于springboot的大学城水电管理系统源码数据库
  • AI大模型探索之路-应用篇2:Langchain框架ModelIO模块—数据交互的秘密武器
  • 【SSH】群晖开启ssh访问
  • Vue 移动端(H5)项目怎么实现页面缓存(即列表页面进入详情返回后列表页面缓存且还原页面滚动条位置)keep-alive缓存及清除keep-alive缓存
  • 【MVCC】深入浅出彻底理解MVCC
  • 【问题解决】ubuntu安装新版vscode报code-insiders相关错误
  • 【Python】面向对象(专版提升2)
  • Vscode设置滚轮进行字体大小的调节
  • 【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件
  • Spring Validation解决后端表单校验
  • Harmony鸿蒙南向驱动开发-UART接口使用
  • 【示例】MySQL-事务控制示例:账户转账-savepoint关键字
  • STM32使用标准版RT-Thread,移植bsp中的板文件后,想使用I/O设备模型,使用串口3或者串口4收发时,发现串口3或者串口4没反应
  • MVCC(解决MySql中的并发事务的隔离性)