开发平台基本信息
芯片: 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;
拦截之后会发现,没了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();
最终通过persist.sys.taskbar.enable属性来控制要不要显示Taskbar。