Android 13 修改Framework,监听屏幕手势滑动(SystemUI左右侧滑/手势导航)、监听屏幕上下根部往相对一侧滑动。

写在前面:Android13支持手势导航,设置中打开,SystemUI里实现,用户在屏幕左右侧 手势滑动执行返回功能,其实SystemUI调用的是Framework中现成的判断方法,这里贴出手势判断代码的位置,帮助需要做相关需求的同学

代码位置:frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java

    DisplayPolicy(WindowManagerService service, DisplayContent displayContent) {
    
    
        mService = service;
        mContext = displayContent.isDefaultDisplay ? service.mContext
                : service.mContext.createDisplayContext(displayContent.getDisplay());
                
		. . . . . .
		. . . . . .
		. . . . . .
		
        // TODO(b/181821798) Migrate SystemGesturesPointerEventListener to use window context.
        mSystemGestures = new SystemGesturesPointerEventListener(mUiContext, mHandler,
                new SystemGesturesPointerEventListener.Callbacks() {
    
    

                    @Override
                    public void onSwipeFromTop() {
    
    
                        synchronized (mLock) {
    
    
                            final WindowState bar = mStatusBar != null
                                    ? mStatusBar
                                    : findAltBarMatchingPosition(ALT_BAR_TOP);
                            requestTransientBars(bar, true /* isGestureOnSystemBar */);
                        }
                    }

                    @Override
                    public void onSwipeFromBottom() {
    
    
                        synchronized (mLock) {
    
    
                            final WindowState bar = mNavigationBar != null
                                        && mNavigationBarPosition == NAV_BAR_BOTTOM
                                    ? mNavigationBar
                                    : findAltBarMatchingPosition(ALT_BAR_BOTTOM);
                            requestTransientBars(bar, true /* isGestureOnSystemBar */);
                        }
                    }

                    @Override
                    public void onSwipeFromRight() {
    
    
                        final Region excludedRegion = Region.obtain();
                        synchronized (mLock) {
    
    
                            mDisplayContent.calculateSystemGestureExclusion(
                                    excludedRegion, null /* outUnrestricted */);
                            requestTransientBarsForSideSwipe(excludedRegion, NAV_BAR_RIGHT,
                                    ALT_BAR_RIGHT);
                        }
                        excludedRegion.recycle();
                    }

                    @Override
                    public void onSwipeFromLeft() {
    
    
                        final Region excludedRegion = Region.obtain();
                        synchronized (mLock) {
    
    
                            mDisplayContent.calculateSystemGestureExclusion(
                                    excludedRegion, null /* outUnrestricted */);
                            requestTransientBarsForSideSwipe(excludedRegion, NAV_BAR_LEFT,
                                    ALT_BAR_LEFT);
                        }
                        
                        +Intent intent = new Intent("onSwipeFromLeft_Action");
                        +mContext.sendBroadcast(intent);
                        +Log.d("onSwipeFromLeft"," 收到左侧侧滑");
                        excludedRegion.recycle();
                    }

注:如果APP里面想要监听滑动手势,可以直接在上面的方法onSwipeFromLeft、onSwipeFromRight、onSwipeFromBottom、onSwipeFromTop发广播出来接收,每次对应手势滑动都会调用到这里,亲测有效,在这里改比在SystemUI里改有效,SystemUI里还得打开手势导航才行,这里不需要。

  直接加广播,运行时会报non-protected broadcast的错误:
在这里插入图片描述
  解决方法:在如下位置添加配置
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43522377/article/details/135033555