Android 安卓4.2.2+;

Android 安卓4.2.2+;,android,android-ui,statusbar,android-4.2-jelly-bean,android-launcher,Android,Android Ui,Statusbar,Android 4.2 Jelly Bean,Android Launcher,我想覆盖android状态栏。就我而言,它在上面。我不想覆盖或隐藏导航栏 注意:解决方案必须在android 4.2.2+上运行。我更喜欢非根设备的答案 我已经搜索了很多这样的问题和答案,但没有一个能在4.2.2上运行 下面是我的代码,但它不使用触摸事件。这就是状态栏打开面板的原因。我不想要这个 @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSys

我想覆盖android状态栏。就我而言,它在上面。我不想覆盖或隐藏导航栏

注意:解决方案必须在android 4.2.2+上运行。我更喜欢非根设备的答案

我已经搜索了很多这样的问题和答案,但没有一个能在4.2.2上运行

下面是我的代码,但它不使用触摸事件。这就是状态栏打开面板的原因。我不想要这个

@Override 
public void onCreate() {
    super.onCreate();

    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

    int statusBarHeight = (int) Math.ceil(25 * getResources().getDisplayMetrics().density);

    overlay = new Button(this);
    overlay.setBackgroundColor(Color.GREEN);
    overlay.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.i("StatusBar", "touched");
            return false;
        }
    });

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.FILL_PARENT,
            statusBarHeight,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH|
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.TOP | Gravity.RIGHT;

    windowManager.addView(overlay, params);

}

@Override
public void onDestroy() {
    super.onDestroy();
    if (overlay != null) windowManager.removeView(overlay);
}
在主活动中,我启动服务:

startService(new Intent(this, StatusBarService.class));
并且在AndroidManifest.xml中添加了权限:

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

现在证明它可以在4.2.2中实现:

怎么做?

屏幕截图:

你不能将你的应用程序放在一个notitlebar主题中[不应该删除导航栏],并在顶部实现你自己的视图,该视图模仿通知栏的外观作为一个容器,其余的内容将是片段吗?

在尝试和重复之后,这为我做到了:

int statusBarHeight = (int) Math.ceil(25 * getResources().getDisplayMetrics().density);

WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.FILL_PARENT,
            statusBarHeight,
            WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
            PixelFormat.TRANSLUCENT);

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

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

注意:

  • customViewGroup是扩展任何 布局(框架、相对布局等)并使用触摸事件
  • 要使用触摸事件,请重写的onInterceptTouchEvent方法 查看组并返回true
已更新

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

注意:不需要生根

请提供一些您想要的屏幕截图/图片achieve@JiMMaR:最好的可视化方法是安装并运行MobiLock launcher。密切关注他们的自定义状态栏。即使你在launcher中运行一个允许的应用程序,它也会保持不变。@JiMMaR屏幕截图补充说,当launcher的主窗体位于顶部时,这一点很有效。但如果启动了另一个应用程序,状态栏将再次显示。我设法用StatusBarService.class隐藏了状态栏。但触摸事件被转发到后台的状态栏。所以用户可以滑动状态面板。嗨@Solata,我没有针对你的任何个人信息。谢谢你的澄清。我也会投票赞成你的答案。答案也有很好的解释。通常Stackoverflow包含很多用户,只是为了创建这样的配置文件。关于我的名誉,我不在乎。我来这里不是为了获得好的声誉,我通常不会只阅读拥有40K或更多用户的帖子。有很多人知识渊博,回答得很好,但在这里名声不好。@AzatMartirosyan:我喜欢你关心这件事,但你的方法不好。Stackoverflow有很好的QA评级流程来避免这种非建设性的评论。我应该在statusBarHeight使用什么价值?这在昨天对我有效,但由于某种原因今天不行。。。我无法让它恢复工作。我使用的代码与您发布的代码完全相同。我无法帮助您了解上述详细信息。@Machado如果您能解释您所做的一切,我可以帮助您
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>