当前位置: 首页 > 知识库问答 >
问题:

防止状态栏出现android(修改)

水渊
2023-03-14

我正在实现一个kiosk模式应用程序,我已经成功地使应用程序全屏显示,在4.3之后没有状态栏出现,但在4.3和4.4中无法隐藏状态栏,因为当我们在屏幕顶部向下滑动时,状态栏会出现。

我已经试着在

  • 在清单中指定全屏主题
  • 设置窗口标志ie setFlags
  • setSystemUi可视性

可能重复,但未找到具体解决方案

永久隐藏Android状态栏

最后的事情我想要的是,如何隐藏状态栏永久在一个活动??在android4.3,4.4,5,6版本

共有3个答案

刁远
2023-03-14

对于我参与的一个项目,我已经找到了一个解决方案,但这花了很长时间。Stackoverflow和其他网站上的各种帖子帮助我想出了它。这是AndroidM上的一个变通方案,但效果非常好。正如有人要求的,所以我想我应该把它贴在这里,如果它能让任何人受益的话。

现在已经有一段时间了,我不记得所有的细节了,但是CustomViewGroup是一个覆盖主ViewGroup的类,它检测到用户已经从顶部滑动以显示状态栏。但是我们不想显示它,所以用户的拦截被检测到,任何进一步的操作都被忽略了,也就是说Android操作系统不会收到打开隐藏状态栏的信号。

然后还包括显示和隐藏状态栏的方法,您可以在代码中复制/粘贴想要显示/隐藏状态栏的位置。

/**
 * This class creates the overlay on the status bar which stops it from expanding.
 */
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) {
        Log.v("customViewGroup", "********** Status bar swipe intercepted");
        return true;
    }
}

public static void allowStatusBarExpansion(Context context) {
    CustomViewGroup view = new CustomViewGroup(context);
    WindowManager manager = ((WindowManager) context.getApplicationContext()
            .getSystemService(Context.WINDOW_SERVICE));
    manager.removeView(view);
}

// Stop expansion of the status bar on swipe down.
public static void preventStatusBarExpansion(Context context) {
    WindowManager manager = ((WindowManager) context.getApplicationContext()
            .getSystemService(Context.WINDOW_SERVICE));

    Activity activity = (Activity) context;
    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 receive touch events
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |

            // Draws over status bar
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;

    localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
    //http://stackoverflow.com/questions/1016896/get-screen-dimensions-in-pixels
    int resId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
    int result = 0;
    if (resId > 0) {
        result = activity.getResources().getDimensionPixelSize(resId);
    }

    localLayoutParams.height = result;

    localLayoutParams.format = PixelFormat.TRANSPARENT;

    CustomViewGroup view = new CustomViewGroup(context);

    manager.addView(view, localLayoutParams);
}
苏鸿羽
2023-03-14

在AndroidM中,你必须获得制作覆盖层的额外许可<代码>Android。准许系统警报窗口不足!因此,我在disableStatusBar()中使用了Abhimaan答案中的代码,并试图打开正确的设置对话框。我还在ondestory()中添加了删除视图,以便在应用程序退出时启用状态栏。我还将覆盖层高度降低到40,因为这似乎足够了。这里的代码适用于5.1和6.0。

public static final int OVERLAY_PERMISSION_REQ_CODE = 4545;
protected CustomViewGroup blockingView = null;

@Override
protected void onDestroy() {

    super.onDestroy();

    if (blockingView!=null) {
        WindowManager manager = ((WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE));
        manager.removeView(blockingView);
    }
}


@Override
protected void onCreate(Bundle savedInstanceState) {

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

            if (!Settings.canDrawOverlays(this)) {
                Toast.makeText(this, "Please give my app this permission!", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
            } else {
                disableStatusBar();
            }
        }
        else {
            disableStatusBar();
        }
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
        if (!Settings.canDrawOverlays(this)) {
            Toast.makeText(this, "User can access system settings without this permission!", Toast.LENGTH_SHORT).show();
        }
        else
        { disableStatusBar();
        }
    }
}

protected void disableStatusBar() {

    WindowManager 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 receive 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) (40 * getResources().getDisplayMetrics().scaledDensity);
    localLayoutParams.format = PixelFormat.TRANSPARENT;

    blockingView = new CustomViewGroup(this);
    manager.addView(blockingView, localLayoutParams);
}
郗阳德
2023-03-14

我们无法阻止状态在kitkat设备中以全屏模式出现,因此进行了一项仍然符合要求的黑客攻击,即阻止状态栏扩展。

为了实现这一点,该应用程序并没有全屏显示。我们在状态栏上放置一个覆盖,并使用所有输入事件。它阻止了地位的扩大。

注意:

  • CustViewGroup是自定义类,它扩展任何布局(框架,相对布局等)并消耗触摸事件。
  • 要消耗触摸事件,请重写视图组的onInterceptTouchCase方法并返回true

更新

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

customViewGroup实现

代码:

WindowManager 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);
    localLayoutParams.format = PixelFormat.TRANSPARENT;

    customViewGroup view = new customViewGroup(this);

    manager.addView(view, localLayoutParams);
 类似资料:
  • 本文向大家介绍Android实现的状态栏定制和修改方法,包括了Android实现的状态栏定制和修改方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android实现的状态栏定制和修改方法。分享给大家供大家参考。具体如下: 大家都知道定制在android开发中的重要性,因为通过定制,你才能制造出差异化的产品,才能满足更多消费者的需求, 像HTC生产的手机都通过了深层次的二次开发,今天我也

  • 我想把状态栏的颜色设置为白色,把wifi和电池等图标设置为黑色。我怎么能这样做?。我更喜欢通过使用来完成此操作

  • 本文向大家介绍Android实现隐藏状态栏和标题栏,包括了Android实现隐藏状态栏和标题栏的使用技巧和注意事项,需要的朋友参考一下 隐藏标题栏需要使用预定义样式:android:theme=”@android:style/Theme.NoTitleBar”. 隐藏状态栏:android:theme=”@android:style/Theme.NoTitleBar.Fullscreen”. 以上

  • 我有一个视图控制器,这是导航控制器的rootVc。 我需要为rootview控制器隐藏导航栏,因此我使用以下方法来隐藏它并使其重新出现。 我基本上是在rootVc中隐藏导航栏,并为所有其他视图控制器显示它。 但当我移除导航栏时,我看到我的内容正在状态栏下扩展 有办法解决这个问题吗?

  • vscode setting.json .eslintrc.js eslintignore eslint 也安装了,为什么不生效呢?底下没有看到eslint 的标

  • 问题内容: 众所周知,许多Android应用在首次聚焦之前都会非常短暂地显示白屏。在以下情况下会出现此问题: 扩展全局类并在其中执行主要初始化的Android应用。该 对象总是在第一个对象之前创建(这可以在调试器中观察到),因此这很有意义。这是我的案件延误的原因。 在初始屏幕之前显示默认预览窗口的Android应用。 设置显然在这里不起作用。我也无法将初始屏幕的父主题设置为此处所述,因为[不幸的是