限制通知栏不拉

时间:2019-07-01 14:13:08

标签: android android-9.0-pie kiosk-mode

我的目的是创建一个Kiosk应用程序。我为此检查了许多代码,例如thisthis。在他们的帮助下,我实现了导航栏的隐藏。现在,我想阻止用户像Surelock一样将通知栏向下拖动。我已经尝试过诸如here之类的SO帖子中给出的常见答案。但这在带有Android Pie的Redmi Note 5 Pro中不起作用。还有其他方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:1)

在此解决方案中,通知栏并未完全被阻止,但在用户打开它后将其关闭。您需要一项服务来检查通知栏是否重复打开。该服务使用反射来获取需要的方法,以在打开通知栏后关闭通知栏,因此我认为它无法在android 9设备上正常工作(只需在7.1.1设备上与compilesdk 28一起正常工作即可)。您需要使用此权限:

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

这是该服务的代码:

public class CollapseService extends Service {
    ScheduledExecutorService scheduler;


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public void onCreate() {
        super.onCreate();
        MyRunnable runnable = new MyRunnable(this);

        scheduler = Executors.newScheduledThreadPool(1);
        scheduler.scheduleAtFixedRate
                (runnable, 0, 100, TimeUnit.MILLISECONDS);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        return Service.START_STICKY;
    }

    private void collapseNow() {
        Object statusBarService = getSystemService("statusbar");
        Class<?> statusBarManager = null;

        try {
            statusBarManager = Class.forName("android.app.StatusBarManager");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        Method collapseStatusBar = null;

        try {
            collapseStatusBar = statusBarManager.getMethod("collapsePanels");

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        collapseStatusBar.setAccessible(true);

        try {
            collapseStatusBar.invoke(statusBarService);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        scheduler.shutdown();
    }

    static class MyRunnable implements Runnable{
        CollapseService aService = null;
        MyRunnable(CollapseService service){
            WeakReference<CollapseService> weakReference = new WeakReference<>(service);
            aService = weakReference.get();
        }

        @Override
        public void run(){
            if(aService != null) {
                aService.collapseNow();
            }
        }

    }

}

弱引用是为了消除发生内存泄漏的可能性。

答案 1 :(得分:0)

如果您的信息亭应用是设备所有者(如您所参考的示例中所述),则可以使用DevicePolicyManager.setStatusBarDisabled()

  

禁用状态栏会阻止通知,快速设置和   其他屏幕叠加层,可以从一次性设备中逃脱。

自Android 6(API 23)起可用,状态栏仍显示(带有时间,wifi级别,蓝牙指示器等),但通知不存在,因此无法展开。