Android开发之禁止下拉通知栏的方法

网上查了几篇禁止的方法

第一种:类似于这样

//StatusBarManager.DISABLE_EXPAND
StatusBarManager statusBarManager =
        (StatusBarManager) this.getSystemService(Context.STATUS_BAR_SERVICE);
int state = StatusBarManager.DISABLE_EXPAND;
        statusBarManager.disable(state);

 但是我获取不到StatusBarManager,只能放弃,可以获取到的可以试试

第二种:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    // TODO Auto-generated method stub
    super.onWindowFocusChanged(hasFocus);
    try {
        Object service = getSystemService("statusbar");
        Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
        Method test = statusbarManager.getMethod("collapse");
        test.invoke(service);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

 还要在清单文件中添加上权限

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/>
<uses-permission android:name="android.permission.STATUS_BAR"/>

 还有第三种,我没有详情去看我就放个链接,有空的大家可以去看看

https://blog.csdn.net/u011913612/article/details/72478517

然后说一下我自己的想法把,可以完成这个功能,请大家指教一下

思路:在状态栏上覆盖一层透明view,点击时,直接消费掉,禁止继续往下传递,接触不到状态栏,就拉不出来,比较笨的一个办法,但是也挺有效

废话说的不少了,上代码把:

//禁止下拉
private void UnDropDown() {
    manager = ((WindowManager) 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 |
            // this is to enable the notification to recieve touch events
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
            // Draws over status bar
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
    localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
    localLayoutParams.height = (int) (50 * getResources()
            .getDisplayMetrics().scaledDensity); //50高度这边我是固定死了,也可以动态获取状态栏高度,然后赋值
    localLayoutParams.format = PixelFormat.TRANSPARENT;
    view = new CustomViewGroup(this);
    manager.addView(view, localLayoutParams);
}

CustomViewGroup 代码:

import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ViewGroup;

public 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) {
        //直接消费,不向下传递
        return true;
    }
}

 不要忘记销毁

@Override
protected void onDestroy() {
    super.onDestroy();
    if (view != null) {
        WindowManager manager = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE));
        manager.removeView(view);
    }
}

如果你想要恢复正常:

/**
 * 允许下拉
 * @param context
 */
private void allowDropDown(Context context) {
    CustomViewGroup view = new CustomViewGroup(context);
    WindowManager manager = ((WindowManager) context.getApplicationContext()
            .getSystemService(Context.WINDOW_SERVICE));
    manager.removeView(view);
}

 还有一步清单文件加上一个权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

 如果是6.0以后,记得要加动态权限,防止崩溃哦

猜你喜欢

转载自blog.csdn.net/jiexiao4151/article/details/105537440