Android系统屏蔽滑动出现导航栏和通知栏
需求
某些应用在定制系统内需要维持全屏显示,需要屏蔽滑动上拉出现导航栏和下拉出现通知栏,而且还需要屏蔽手势导航。
系统版本
Android 13
准备工作
知道需要屏蔽操作的应用包名,例如:com.example.myapp
修改涉及到的文件
主要涉及到以下目录的文件
/packages/apps/Launcher3/quickstep/src/com/android/quickstep/TouchInteractionService.java
/frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java
/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
修改步骤
- 屏蔽手势导航
在TouchInteractionService文件中的onInputEvent方法添加判断包名,然后不去响应手势事件。
private void onInputEvent(InputEvent ev) {
......
......
......
if (action == ACTION_DOWN) {
mRotationTouchHelper.setOrientationTransformIfNeeded(event);
// if the task is myapp, don't consumer gesture
+ if (mAM.getRunningTask() != null && mAM.getRunningTask().topActivity != null
+ && "com.example.myapp".equals(mAM.getRunningTask().topActivity.getPackageName())) {
+ mUncheckedConsumer = InputConsumer.NO_OP;
+ } else if (!mDeviceState.isOneHandedModeActive()
&& mRotationTouchHelper.isInSwipeUpTouchRegion(event)) {
// Clone the previous gesture state since onConsumerAboutToBeSwitched might trigger
// onConsumerInactive and wipe the previous gesture state
GestureState prevGestureState = new GestureState(mGestureState);
GestureState newGestureState = createGestureState(mGestureState);
newGestureState.setSwipeUpStartTimeMs(SystemClock.uptimeMillis());
mConsumer.onConsumerAboutToBeSwitched();
mGestureState = newGestureState;
mConsumer = newConsumer(prevGestureState, mGestureState, event);
mUncheckedConsumer = mConsumer;
} else if (mDeviceState.isUserUnlocked() && mDeviceState.isFullyGesturalNavMode()
&& mDeviceState.canTriggerAssistantAction(event)) {
mGestureState = createGestureState(mGestureState);
// Do not change mConsumer as if there is an ongoing QuickSwitch gesture, we
// should not interrupt it. QuickSwitch assumes that interruption can only
// happen if the next gesture is also quick switch.
mUncheckedConsumer = tryCreateAssistantInputConsumer(mGestureState, event);
} else if (mDeviceState.canTriggerOneHandedAction(event)) {
// Consume gesture event for triggering one handed feature.
mUncheckedConsumer = new OneHandedModeInputConsumer(this, mDeviceState,
InputConsumer.NO_OP, mInputMonitorCompat);
} else {
mUncheckedConsumer = InputConsumer.NO_OP;
}
} else {
// Other events
if (mUncheckedConsumer != InputConsumer.NO_OP) {
// Only transform the event if we are handling it in a proper consumer
mRotationTouchHelper.setOrientationTransformIfNeeded(event);
}
}
......
......
......
}
- 屏蔽上拉出现导航栏
同样在DisplayPolicy文件中添加判断包名的方法,从而不去执行操作。
+boolean isMyApp() {
+ try {
+ ActivityTaskManager activityTaskManager = ActivityTaskManager.getInstance();
+ List<ActivityManager.RunningTaskInfo> runningTaskInfoList =
+ activityTaskManager.getTasks(1);
+
+ if (runningTaskInfoList == null || runningTaskInfoList.isEmpty()) {
+ Slog.i(TAG, "No running task found!");
+ return false;
+ }
+
+ ActivityManager.RunningTaskInfo runningTaskInfo = runningTaskInfoList.get(0);
+
+ ComponentName topActivity = runningTaskInfo.topActivity;
+ if (topActivity == null) {
+ Slog.i(TAG, "No topActivity!");
+ return false;
+ }
+
+ if ("com.example.myapp".equals(topActivity.getPackageName())) {
+ return true;
+ }
+ } catch (Exception e) {
+ Slog.e(TAG, e.getMessage());
+ }
+ return false;
+}
@VisibleForTesting
void requestTransientBars(WindowState swipeTarget, boolean isGestureOnSystemBar) {
// if running task is myapp, don't transient bars
+ if (isMyApp()) {
+ return;
+ }
......
......
......
}
- 屏蔽滑动下拉出现通知栏
在CommandQueue文件中的panelsEnabled方法添加判断包名,从而不使能状态栏下拉操作。
public boolean panelsEnabled() {
+ ActivityManagerWrapper mAM = ActivityManagerWrapper.getInstance();
+ if (mAM.getRunningTask() != null && mAM.getRunningTask().topActivity != null
+ && "com.example.myapp".equals(mAM.getRunningTask().topActivity.getPackageName())) {
+ return false;
+ } else {
final int disabled1 = getDisabled1(mDisplayTracker.getDefaultDisplayId());
final int disabled2 = getDisabled2(mDisplayTracker.getDefaultDisplayId());
return (disabled1 & StatusBarManager.DISABLE_EXPAND) == 0
&& (disabled2 & StatusBarManager.DISABLE2_NOTIFICATION_SHADE) == 0;
+ }
}
总结
以上就是Android系统屏蔽滑动出现导航栏和通知栏,并且不响应手势导航的方法。