gpt4 book ai didi

android - 在 Oreo 中禁用状态栏拉取

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:25 29 4
gpt4 key购买 nike

通过禁用拉动和单击状态栏来 kiosking 应用程序的方法在 android 8 上不起作用。如在 How to disable status bar click and pull down in Android? 上回答的那样

  1. 您可以在状态栏上放置一个窗口以禁用任何触摸或下拉。

正如这个答案所描述的,这种方法确实适用于 android 7 及以下版本,但是这种方法不适用于 android 8(oreo)。

我已经在 android 7 及更低版本上测试过它并且它可以工作,但是在 android 8 上拉动时状态栏仍然拉下。

如果您对此有解决方案,请提供帮助。

谢谢大家

最佳答案

对于 8 及更高版本,您无法真正完全覆盖其他应用程序的 View ,因此您要做的是,当您拉下抽屉时,尽快将抽屉放回原处,以至于用户无法点击任何东西在上面。这是执行此操作的代码。确保您在 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();
}
}
}

然后隐藏状态栏的助手类如下所示。

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);
}
}

关于android - 在 Oreo 中禁用状态栏拉取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51607072/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com