简体   繁体   English

禁用Oreo中的状态栏拉

[英]Disable status bar pull in Oreo

The method for kiosking an application by disabling pull and click of the status bar does not work on android 8. As anserwed on How to disable status bar click and pull down in Android? 通过禁用拉动和单击状态栏来自助应用程序的方法在Android 8上不起作用。 如何禁用状态栏在Android中单击并下拉?

  1. You can lay a window over the status bar to disable any touch or pulling down. 您可以在状态栏上方放置一个窗口以禁用任何触摸或下拉。

As described by this answer, this method of doing it does works on android 7 and below however this method does not work on android 8(oreo). 正如这个答案所描述的,这种方法可以在android 7及以下版本中运行,但是这种方法在android 8(oreo)上不起作用。

I have tested it on android 7 and less and it works, but the status bar still pulls down when pulled on android 8. 我已经在android 7上测试了它并且它可以工作,但是在Android 8上拉动时状态栏仍然会拉下来。

If you have a solution on this please assist. 如果您有解决方案请协助。

Thank you all. 谢谢你们。

For and 8 and above you cant realy fully overylay a view over other apps, so what you have to do is, when you pull the drawer down, return the drawer back up so fast that the user wont be able to click anything on it. 对于和8及以上你不能完全覆盖其他应用程序的视图,所以你需要做的是,当你拉下抽屉时,将抽屉快速返回到用户无法点击它上面的任何东西。 This is the code that does that. 这是执行此操作的代码。 Make sure you are doing this on an activity. 确保您在活动中执行此操作。

    @Override
public void onWindowFocusChanged(boolean hasFocus) {

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

        if (!hasFocus) {

            Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            sendBroadcast(closeDialog);


            // Method that handles loss of window focus
            new BlockStatusBar(this,false).collapseNow();
        }
    }
}

Then the helper class that is doing the job of hiding the status bar is as indicated below. 然后执行隐藏状态栏的辅助类如下所示。

public class BlockStatusBar {
Context context;

// To keep track of activity's window focus
boolean currentFocus;
// To keep track of activity's foreground/background status
boolean isPaused;

public static Handler collapseNotificationHandler;
Method collapseStatusBar = null;


public BlockStatusBar(Context context,boolean isPaused) {
    this.context=context;
    this.isPaused=isPaused;
    collapseNow();
}

public void collapseNow() {

    // Initialize 'collapseNotificationHandler'
    if (collapseNotificationHandler == null) {
        collapseNotificationHandler = new Handler();
    }

    // If window focus has been lost && activity is not in a paused state
    // Its a valid check because showing of notification panel
    // steals the focus from current activity's window, but does not
    // 'pause' the activity
    if (!currentFocus && !isPaused) {

        // Post a Runnable with some delay - currently set to 300 ms
        collapseNotificationHandler.postDelayed(new Runnable() {

            @Override
            public void run() {

                // Use reflection to trigger a method from 'StatusBarManager'

                Object statusBarService = context.getSystemService("statusbar");
                Class<?> statusBarManager = null;

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



                try {

                    // Prior to API 17, the method to call is 'collapse()'
                    // API 17 onwards, the method to call is `collapsePanels()`

                    if (Build.VERSION.SDK_INT > 16) {
                        collapseStatusBar = statusBarManager .getMethod("collapsePanels");
                    } else {
                        collapseStatusBar = statusBarManager .getMethod("collapse");
                    }
                } 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();
                }

                // Check if the window focus has been returned
                // If it hasn't been returned, post this Runnable again
                // Currently, the delay is 100 ms. You can change this
                // value to suit your needs.
                if (!currentFocus && !isPaused) {
                    collapseNotificationHandler.postDelayed(this, 100L);
                }

                if (!currentFocus && isPaused) {
                    collapseNotificationHandler.removeCallbacksAndMessages(null);
                }

            }
        }, 1L);
    }
}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM