IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> RK3588_android12《5S自动隐藏导航栏,上划显示导航栏及第三方的发送广播控制》 -> 正文阅读

[移动开发]RK3588_android12《5S自动隐藏导航栏,上划显示导航栏及第三方的发送广播控制》


前言

RK3588-android12代码,添加5s自动隐藏导航栏,上划显示导航栏,然后第三方app也能发广播控制功能,当广播隐藏后上划不再显示导航栏。

    修改1:     packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
    修改2:     packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
    修改3:     services/core/java/com/android/server/wm/DisplayPolicy.java

一、5s自动隐藏导航栏

修改1:     packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java

首先NavigationBarController.java这个类是控制导航的创建的,在这里添加自己的5s自动隐藏导航栏逻辑,在创建导航栏的方法:

public void createNavigationBars(final boolean includeDefaultDisplay,
            RegisterStatusBarResult result)

里面添加 5s延时,然后进行导航的移除。

--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
@@ -292,7 +292,14 @@ public class NavigationBarController implements Callbacks,
         removeNavigationBar(displayId);
         createNavigationBar(mDisplayManager.getDisplay(displayId), savedState, null /* result */);
     }
-
+	//添加移除的逻辑
+	public void hideNavigationBar() { //add pang
+        Display[] displays = mDisplayManager.getDisplays();
+        for (Display display : displays) {
+            removeNavigationBar(display.getDisplayId());
+        }
+    }//end	
+	
     // TODO(b/117478341): I use {@code includeDefaultDisplay} to make this method compatible to
     // CarStatusBar because they have their own nav bar. Think about a better way for it.
     /**
@@ -312,6 +319,13 @@ public class NavigationBarController implements Callbacks,
                 createNavigationBar(display, null /* savedState */, result);
             }
         }
+		//add pang
+	    //5S后调用移除的逻辑
+        new Handler().postDelayed(new Runnable() {
+                public void run() {
+                 hideNavigationBar();//调用上面移除的方法
+                }
+            },5000);
+		//end	
     }

二、上划显示导航栏及第三方的发送广播控制

1.实现接受广播控制导航

修改2:     packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java

添加自定义的广播:

@@ -264,6 +264,7 @@ import javax.inject.Named;
 import javax.inject.Provider;
 
 import dagger.Lazy;
+import android.os.SystemProperties;
 public class StatusBar extends SystemUI implements DemoMode,
         ActivityStarter, KeyguardStateController.Callback,
@@ -284,6 +285,10 @@ public class StatusBar extends SystemUI implements DemoMode,
     public static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
     public static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
     static public final String SYSTEM_DIALOG_REASON_SCREENSHOT = "screenshot";
+    //am broadcast -a "action.ACTION_API_SHOW_NAVIGATION"
+    //am broadcast -a "action.ACTION_API_HIDE_NAVIGATION"
+    public static final String ACTION_API_HIDE_NAVIGATION = "action.ACTION_API_HIDE_NAVIGATION"; //add  pang
+    public static final String ACTION_API_SHOW_NAVIGATION = "action.ACTION_API_SHOW_NAVIGATION"; //add  pang
 
     private static final String BANNER_ACTION_CANCEL =
             "com.android.systemui.statusbar.banner_action_cancel";
@@ -1439,6 +1444,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(ACTION_API_HIDE_NAVIGATION); //add  pang 添加到广播队列里
+        filter.addAction(ACTION_API_SHOW_NAVIGATION); //add  pang 添加到广播队列里
         mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL);
     }

调用(修改1:NavigationBarController.java)NavigationBarController这个类自定义的隐藏和创建导航栏方法

+	//add  pang
+    private void hideNavigation() {
+            NavigationBarView mNavigationBarView = mNavigationBarController.getDefaultNavigationBarView();
+            if (mNavigationBarView != null)
+                mNavigationBarController.hideNavigationBar();//NavigationBarController自定义的隐藏导航栏方法
+			SystemProperties.set("hide.navigation","true");
+    }
+ 
+    private void apiShowNavigation() {
+            
+             NavigationBarView mNavigationBarView = mNavigationBarController.getDefaultNavigationBarView();
+             if (mNavigationBarView == null)
+                 mNavigationBarController.createNavigationBars(true,null);//NavigationBarController创建导航栏方法,这个方法中实现了5S的延时自动隐藏逻辑
+			 SystemProperties.set("hide.navigation","false");
+     }
+     //end
+     // TODO(b/117478341): This was left such that CarStatusBar can override this method.
     // Try to remove this.
     protected void createNavigationBar(@Nullable RegisterStatusBarResult result) {
-        mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */, result);
+	 //false 开机不显示导航栏,设置为true会开机显示导航栏,5s后再才会隐藏
+        mNavigationBarController.createNavigationBars(false /* includeDefaultDisplay */, result);
     }

接受广播后调用上面实现的隐藏和显示方法

@@ -3092,6 +3115,13 @@ public class StatusBar extends SystemUI implements DemoMode,
             else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) {
                 mQSPanelController.showDeviceMonitoringDialog();
             }
+			//add pang
+			else if(ACTION_API_HIDE_NAVIGATION.equals(action)) { 
+                hideNavigation(); //隐藏导航栏
+            }
+            else if(ACTION_API_SHOW_NAVIGATION.equals(action)) { 
+                apiShowNavigation(); //显示导航栏
+            }//end
             Trace.endSection();
         }
     };

此时已经可以发送广播进行控制隐藏和显示:
am广播控制:

   am broadcast -a "action.ACTION_API_SHOW_NAVIGATION"
   am broadcast -a "action.ACTION_API_HIDE_NAVIGATION"

2.上划显示导航栏

 修改3:     services/core/java/com/android/server/wm/DisplayPolicy.java

上面已经实现通过广播隐藏和显示导航功能,我们要的是在有上划的动作后,发送自定义的显示导航栏广播,从而实现上划显示导航栏的功能。

--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -179,6 +179,7 @@ import com.android.server.wm.InputMonitor.EventReceiverInputConsumer;
 import java.io.PrintWriter;
 import java.util.HashMap;
 import java.util.function.Consumer;
+import android.os.SystemProperties;
 
 /**
  * The policy that provides the basic behaviors and states of a display to show UI.
@@ -430,6 +431,7 @@ public class DisplayPolicy {
     }
 
     DisplayPolicy(WindowManagerService service, DisplayContent displayContent) {
+		final String ACTION_SYSTEMUI = "action.ACTION_API_SHOW_NAVIGATION";
         mService = service;
         mContext = displayContent.isDefaultDisplay ? service.mContext
                 : service.mContext.createDisplayContext(displayContent.getDisplay());
@@ -477,8 +479,14 @@ public class DisplayPolicy {
                             if (mNavigationBar != null
                                     && mNavigationBarPosition == NAV_BAR_BOTTOM) {
                                 requestTransientBars(mNavigationBar);
                            }
                            checkAltBarSwipeForTransientBars(ALT_BAR_BOTTOM);
+							//广播设置隐藏导航栏后,上划不再发送显示广播
+							 //add pang		 
+							 if (!"true".equals(SystemProperties.get("hide.navigation"))){
+								 Intent intent = new Intent(ACTION_SYSTEMUI);
+								 mContext.sendBroadcast(intent);
+							 }
+							 //end
                         }
                     }

总结

细心的人已经发现上面还有一个地方没有提到的,就是我们在修改2中StatusBar.java设计的隐藏和显示导航栏的逻辑中添加了系统的属性设置

hideNavigation():
                     —> SystemProperties.set("hide.navigation","true");
apiShowNavigation():
                     —>SystemProperties.set("hide.navigation","false");

和修改3:DisplayPolicy.java的系统的属性设置判断

 if ("false".equals(SystemProperties.get("hide.navigation"))){
 ....
 ....
 ...
 }

不添加这部分的逻辑是会有一个bug,就是当第三方的app或者自行发送广播控制导航栏隐藏时,只要上划就会显示导航栏,从而达不到真正意义的隐藏,提供的第三方广播接口也就没有实际的用途。所以通过系统属性设置和判断实现第三方广播接口实际用途,即:

第三方隐藏广播:ACTION_API_HIDE_NAVIGATION = "action.ACTION_API_HIDE_NAVIGATION";>hideNavigation()> SystemProperties.set("hide.navigation","true");

此时系统变量"hide.navigation""true"上划时判断"hide.navigation"是否为"false",是"false"才发送显示导航栏广播。所以上划不会显示导航栏。

第三方隐藏广播:ACTION_API_SHOW_NAVIGATION = "action.ACTION_API_SHOW_NAVIGATION";>apiShowNavigation()> SystemProperties.set("hide.navigation","false");

此时系统变量"hide.navigation""false"上划时判断"hide.navigation"是否为"false",是"false"才发送显示导航栏广播。所以上划会显示导航栏。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:45:08  更:2022-06-14 22:45:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 1:40:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码