• [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。

  • 相关阅读:
    TypeScript手写+项目实际
    Flask 学习100-Flask-SocketIO 结合 xterm.js 实现网页版Xshell
    KT148A语音芯片按键版本一对一触发播放常见的问题集锦FAQ_V4
    【Docker】docker swarm集群搭建和相关命令分享
    【Factory模式】C++设计模式——工厂模式
    C++ Tutorials: Boolean Operations
    【Rust 日报】2022-06-19 Rust 1.63 新特性令人期待
    【差旅游记】启程-新疆哈密(1)
    刷题记录(NC16645 [NOIP2007]矩阵取数游戏,NC207781 迁徙过程中的河流,NC235953 最大m个子段和)
    JZ6 从尾到头打印链表
  • 原文地址:https://blog.csdn.net/Hebin320320/article/details/133801139