Android开发禁用通知栏下拉

2022-01-11 15:10:38 浏览数 (2)

应用禁用通知栏下拉这个需求让我头疼了好几天 statusbar用了后但是效果不是很满意 其他的方法试过但是没有效果,所以就换个思路吧 做法是在通知栏区域弄一个透明的window,这样下拉的时候触摸的区域就是这个window,系统的就下拉不了了 该做法是需要在应用上方显示一个window 所以需要权限

代码语言:javascript复制
 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
代码语言:javascript复制
 public static final String STATUS_BAR_HEIGHT = "status_bar_height";
  public static final String DIMEN = "dimen";
  public static final String DEF_PACKAGE = "android";
   public static void preventStatusBarExpansion(Context context) {
    WindowManager manager = ((WindowManager) context.getApplicationContext()
                                                    .getSystemService(Context.WINDOW_SERVICE));

    WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
    localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
    localLayoutParams.gravity = Gravity.TOP;
    localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;

    localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;

    int resId = context.getResources()
                       .getIdentifier(STATUS_BAR_HEIGHT, DIMEN, DEF_PACKAGE);
    int result;
    if (resId > 0) {
      result = context.getResources()
                      .getDimensionPixelSize(resId);
    } else {
      // Use Fallback size:
      result = 60; // 60px Fallback
    }

    localLayoutParams.height = result;
    localLayoutParams.format = PixelFormat.TRANSPARENT;

    if (view == null) {
      view = new CustomViewGroup(context);
    }

    try {
      if (manager != null) {
        manager.addView(view, localLayoutParams);
      }
    } catch (Exception ignored) {
    }
  }

  public static void allowStatusBarExpansion(Context context) {
    WindowManager manager = ((WindowManager) context.getApplicationContext()
                                                    .getSystemService(Context.WINDOW_SERVICE));
    try {
      if (manager != null) {
        manager.removeViewImmediate(view);
      }
    } catch (Exception ignored) {
    }
  }

  public static class CustomViewGroup extends ViewGroup {
    public CustomViewGroup(Context context) {
      super(context);
    }

    @Override
    protected void onLayout(boolean changed,
                            int l,
                            int t,
                            int r,
                            int b) {
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
      // Intercepted touch!
      return true;
    }
  }

0 人点赞