我正在尝试在Android 4.4设备上隐藏系统状态栏。这适用于自助服务终端模式,我的应用程序将成为设备上唯一运行的应用程序。目前的目标设备是2013 Nexus 7。
的装置是植根,我已经能够完全除去底部导航栏与来自一些信息this post
对于顶级状态栏,我尝试过的所有内容都只是暂时隐藏了该栏。如果我的用户在屏幕顶部向下移动,状态栏会重新出现。我不想让他们看到时间,进行设置甚至看到通知。
我发现的帖子已经尝试过了:
有什么建议吗?
在理想情况下,我很想能够编辑build.prop要做到这一点,因为我已经在做,对于导航栏,并能同时做到这一点。我正在尝试不必构建自己的android映像。
更新
经过一些工作,这似乎在某种程度上取决于android的确切构建,或者它运行的设备。
某些设备,例如我一直在使用的Nexus系列,允许用户滑动以重新显示该条。
不过,我最近想这对Verizon的Eclipse和酒吧没有再出现,这正是我所期待的。
我仍在寻找一种更好的解决方案来定位所有设备,但它可能会归结为创建我自己的android版本。
答案 0 :(得分:30)
我们无法阻止在kitkat设备中以全屏模式显示状态,因此制作了一个仍然符合要求的黑客攻击,即阻止状态栏扩展。
为此,该应用程序未全屏显示。我们在状态栏上放置了一个叠加层并消耗了所有输入事件。它阻止了地位的扩大。
<强> 注意:的强>
<强>更新强>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
customViewGroup implementation 代码:
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);
希望这有助于你
答案 1 :(得分:19)
我知道这是一个古老的问题,但希望它会对某人有所帮助。这里有两个非常简单的调用来禁用和启用我之前使用过的状态栏。可以从命令行使用,也可以由Java应用程序执行:
禁用:
service call activity 42 s16 com.android.systemui
启用:
am startservice -n com.android.systemui/.SystemUIService
答案 2 :(得分:18)
我确实尝试过@gonglong提供的解决方法,但我对结果感到不满意,因为随着解决方法的推出,用户界面出现了闪光。
相反,我能够以root身份执行此操作:
settings put secure user_setup_complete 0
我认为在普通设备上,这会导致初始设备设置启动,但在我的设备上,我已从系统中移除了该APK,因此无法实现。
在我找不到的任何地方都没有记录,但效果很好,顶级设置界面无法被拖放。通知区域仍然可以拖放。
我觉得有用的另一个设置是:
settings put global device_provisioned 0
这会隐藏Power菜单中的飞行模式和静音模式选项,这对我的应用程序来说是一个额外的好处。
可能会有更多的副作用,但我还没有发现任何重要的事情。
此列表取自运行全新Android 4.4.3(KTU84L)的Nexus 7 2013 LTE。方括号中的数字是我拉取db文件时的值,该文件是在基本设置设备设置和启用开发人员/ USB之后,但在设置中进行任何其他更改之前
此文件位于data/data/com.android.providers.settings/databases/settings.db
注意:某些URL需要添加额外的空格字符以绕过SO过滤器
system
名称空间global
名称空间secure
名称空间答案 3 :(得分:4)
我用这个答案来隐藏软键:https://stackoverflow.com/a/27003890/1525867
用于禁用状态栏(这可能会损坏您的设备,因此请在执行此操作之前多次破坏我的设备)在华硕Tinker Board,Android 6上进行测试:
path
从您的设备中提取SystemUI.apk
:
adb pull /system/priv-app/SystemUI/SystemUI.apk
SystemUI.apk
的路径可能不同
从您的设备framework-res.apk
拉adb pull /system/framework/framework-res.apk
framework-res.apk
的路径可能不同
运行apktool if framework-res.apk
运行apktool if SystemUI.apk
运行apktool d SystemUI.apk
打开SystemUI\res\layout\status_bar.xml
并将android:visibility="gone"
添加到最顶层的xml元素(对我来说是com.android.systemui.statusbar.phone.PhoneStatusBarView
)
运行apktool b SystemUI
转到SystemUI\original
并将AndroidManifest.xml
和META-INF
复制到SystemUI\build\apk\
再次运行apktool b SystemUI
转到SystemUI\dist\
并使用SystemUI.apk
SystemUI\dist\SystemUI.apk
adb push SystemUI\dist\SystemUI.apk /system/priv-app/SystemUI/SystemUI.apk
重启设备
基于此帖子https://forum.xda-developers.com/showthread.php?t=2203166
答案 4 :(得分:2)
我没有完美的解决方案,但这里有一个解决方法。基本思路是监听系统ui状态变化并强制导航/状态栏不可见。它的效果与设置IMMERSIVE_STICKY模式类似,但导航/状态栏的消失速度比IMMERSIVE_STICKY快。
这里是:
在onCreate()和onResume函数中设置系统ui样式,并设置system ui change listener
mDecroView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
mDecroView.setOnSystemUiVisibilityChangeListener(this);
强制系统栏在onSystemUiVisibilityChange中不可见,在几秒钟之后设置系统ui否则它会生效(不知道确切原因,系统栏显示尚未完成时系统ui设置请求可能忽略)
public void onSystemUiVisibilityChange(int visibility) {
// TODO Auto-generated method stub
Log.d(TAG, "onSystemUiVisibilityChange called with visibility " + visibility);
if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0){
if(null == mHandler){
mHandler = new MyHandler();
}
if(null != mHandler){
mHandler.removeMessages(MSG_HIDE_SYSTEM_BAR);
mHandler.sendEmptyMessageDelayed(MSG_HIDE_SYSTEM_BAR, 50);
}
//the deccro view is not in full screen
Log.d(TAG, "setSystemUiVisibility");
Log.d(TAG, "current system ui is " + mDecroView.getSystemUiVisibility());
}
}
然后你可以像这样设置系统ui:
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch(msg.what){
case MSG_HIDE_SYSTEM_BAR:
mDecroView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
break;
}
}
答案 5 :(得分:2)
我为该问题找到了一个很好的解决方案,设置了每个活动theme
&amp; windowSoftInputMode
以下值:
<activity android:name=".MyActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:windowSoftInputMode="adjustResize"> <!-- theme : to set the activity to a full screen mode without a status bar(like in some games) -->
</activity> <!-- windowSoftInputMode : to resize the activity so that it fits the condition of displaying a softkeyboard -->
了解更多信息refer here。
答案 6 :(得分:0)
之前添加:setContentView(R.layout.x);
this.requestWindowFeature(Window.FEATURE_NO_TITLE); // Removes title bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.x);
答案 7 :(得分:0)
尝试此代码:
禁用状态栏和导航栏
adb shell
su
pm disable com.android.systemui
reboot
启用状态栏和导航栏
adb shell
su
pm enable com.android.systemui
reboot
它可在Android 5.1.1上运行,但USB摄像头已关闭