• [QCM6125][Android13] 大屏显示时任务栏以及虚拟按键靠右问题


    开发平台基本信息

    芯片: QCM6125
    版本: Android 13
    kernel: msm-4.14

    问题描述

    调试的时候,将dpi修改为160之后,发现虚拟导航栏会缩在右下角,以及进入应用时底部会显示Launcher3的hotseat栏目,具体如下图:
    在这里插入图片描述

    解决方法

    在安卓12以上版本引入了Taskbar,在大屏显示的情况下用Taskbar代替NavigationBar;Taskbar的加载流程可以参考Android 13 平板Taskbar加载流程。

    简单总结流程如下:

    • 通过公式(屏幕最小边长*160)/dpi < 600来判断是否为平板
    • 如果是平板设备,则移除Navigationbar同时创建Taskbar
    • Launcher3通过TaskbarManager创建Taskbar

    在Launcher3拦截Taskbar创建

    --- a/QSSI.13/packages/apps/Launcher3/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
    +++ b/QSSI.13/packages/apps/Launcher3/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
    @@ -50,6 +50,7 @@ import com.android.quickstep.SystemUiProxy;
     import com.android.quickstep.TouchInteractionService;
     import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
     import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider;
    +import android.os.SystemProperties;
     
     import java.io.PrintWriter;
     
    @@ -262,6 +263,9 @@ public class TaskbarManager {
     
         private void recreateTaskbar() {
             destroyExistingTaskbar();
    +        if (SystemProperties.get("persist.sys.taskbar.enable","0").equals("0")){
    +            return;
    +        }
     
             DeviceProfile dp =
                     mUserUnlocked ? LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    拦截之后会发现,没了Taskbar的同时,NavigationBar也没有显示出来,所以要在SystemUI中去创建NavigationBar

    --- a/QSSI.13/frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java
    +++ b/QSSI.13/frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/utilities/Utilities.java
    @@ -31,6 +31,7 @@ import android.os.Message;
     import android.util.DisplayMetrics;
     import android.view.Surface;
     import android.view.WindowManager;
    +import android.os.SystemProperties;
     
     /* Common code */
     public class Utilities {
    @@ -128,6 +129,9 @@ public class Utilities {
         /** @return whether or not {@param context} represents that of a large screen device or not */
         @TargetApi(Build.VERSION_CODES.R)
         public static boolean isTablet(Context context) {
    +        if (SystemProperties.get("persist.sys.taskbar.enable","0").equals("0")){
    +            return false;
    +        }
             final WindowManager windowManager = context.getSystemService(WindowManager.class);
             final Rect bounds = windowManager.getCurrentWindowMetrics().getBounds();
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    最终通过persist.sys.taskbar.enable属性来控制要不要显示Taskbar。

  • 相关阅读:
    环境污染、空气质量数据集:省/市/县PM2.5浓度、空气流通系数、逆温数据
    目标检测的yolov3、4、5、6总结
    antd vue实现table的分页组件固定位置的效果
    【c++ 封装、继承、多态】
    使用DMFLDR工具将Excel数据导入到达梦数据库
    Vue2.0+AntvX6—边 Edge
    Axure9 基本操作(二)
    贪心算法(算法竞赛、蓝桥杯)--线段覆盖
    【科学文献计量】metaknowledge创建和处理知识网络的方法与 RC.networkCoAuthor()中的参数解释
    C. Rings---Codeforces Round #741 (Div. 2)
  • 原文地址:https://blog.csdn.net/Hebin320320/article/details/133801139