有没有办法在Android 3.0中隐藏系统栏? 这是一个内部设备,我正在pipe理导航

在Android 2.3及以下版本中,您可以使应用程序全屏,然后通过返回false onKeyDown()…并将应用程序注册为默认主页启动器应用程序来“劫持”菜单/返回/searchbutton,没有办法退出应用程序。

在Android 3.0(蜂巢)导航button(系统栏)总是存在,我想隐藏它。 可能吗?

仅供参考,我不会在Android Market上发布这个应用程序。 这是要在内部使用的设备的内部应用程序,我需要保护设备。

您不能在Android 3.0上隐藏系统栏。

由于使用公共API无法做到这一点,因此我find了一种以非常“黑客行为”的方式来做到这一点的方法,它需要一个根植的设备。

更新:作为user864555指出下面,这是另一个解决scheme

$ adb remount $ adb shell mv /system/app/SystemUI.odex /system/app/SystemUI.odexold $ adb shell mv /system/app/SystemUI.apk /system/app/SystemUI.apkold $ adb reboot 

“这段代码禁用了应用程序SystemUI,它是实际的菜单栏,这个修改,你也将获得系统栏的空间,但是确保有一个后退button或者某个东西退出。

这也很好。 请投票答复。 我会尽量保持这一个尽可能多的更新。


更新:这是第三种方法。 以编程方式或使用命令行的方式。 在这里find: http : //android.serverbox.ch/?p=306

此方法需要root访问权限,但不需要更改LCD密度,保持与原始相同,并且可以快速方便地取回UI导航栏,而无需每次都重新启动。

该博客文章还展示了如何在Android应用程序上实现它,记住它需要root权限,除非您的应用程序运行在信息亭或自己的设备上,否则不要这样做。在Android市场或任何地方发布的应用程序。

要停止/删除/禁用系统栏(在发出此命令之前需要su):

 $ service call activity 79 s16 com.android.systemui 

要恢复系统栏,只需发出以下命令:

 $ am startservice -n com.android.systemui/.SystemUIService 

这很容易。 希望ICS很快就会与源代码一起发布,以便任何人都可以为我们的Kiosk平板电脑构buildAndroid。

如果你有访问系统文件,你可以做到这一点(我是解锁和根源,所以我不知道你需要什么,我还没有尝试与工厂新鲜的Xoom):

 adb shell cd /system/app/ mv SystemUI.odex SystemUI.odexold mv SystemUI.apk SystemUI.apkold exit adb reboot 

该代码禁用了实际菜单栏的应用程序SystemUI。 通过这种修改,您也将获得该系统栏的空间,但确保您有应用程序退出button或某些内容。

编辑:

如果您在只读文件时遇到问题,您需要将/system目录挂载为读写。 为此,请在adb shell中使用此命令(来源: http : //forum.xda-developers.com/showthread.php? t=1159495& page=5 )

 mount -o remount,rw /dev/block/stl6 /system 

您可以使用该命令将其重新挂载为只读:

 mount -o remount,ro /dev/block/stl6 /system 

编辑:

这种方法允许软键盘在需要时正常显示。

这是与我以前的答案相关的代码。 它会自动隐藏状态栏并在完成时再次显示。 重要提示:要再次显示它,代码必须重新启动system_server,这需要一些时间来重新启动,在此期间,您将看到蜂窝启动animation。 这是我现在发现的再次显示状态栏。 重新启动SystemUI是不够的。 因此,重启system_server时会closures你的应用程序。

这段代码需要一个安装有超级用户的rooted操作系统。

 package com.projects; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.io.PrintStream; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TableLayout.LayoutParams; // http://www.stealthcopter.com/blog/2010/01/android-requesting-root-access-in-your-app/ public class FullScreenTestActivity extends Activity implements Button.OnClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { Process p; p = Runtime.getRuntime().exec("su"); // Attempt to write a file to a root-only DataOutputStream os = new DataOutputStream(p.getOutputStream()); os.writeBytes("mount -o remount,rw /dev/block/stl6 /system\n"); os.writeBytes("mv /system/app/SystemUI.odex /system/app/SystemUI_Old.odex\n"); os.writeBytes("mv /system/app/SystemUI.apk /system/app/SystemUI_Old.apk\n"); os.writeBytes("mount -o remount,ro /dev/block/stl6 /system\n"); // Close the terminal os.writeBytes("exit\n"); os.flush(); p.waitFor(); new AlertDialog.Builder(this) .setIconAttribute(android.R.attr.alertDialogIcon) .setMessage("Android Honeycomb StatusBar removed successfully!") .show(); // Set action for exiting. Button cmdExit = new Button(this); cmdExit.setText("Exit"); cmdExit.setOnClickListener(this); this.addContentView(cmdExit, new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); } catch (Exception e) { ShowErrorGlobal(e); } } public void onClick(View v) { try { Process p; p = Runtime.getRuntime().exec("su"); // Attempt to write a file to a root-only DataOutputStream os = new DataOutputStream(p.getOutputStream()); os.writeBytes("mount -o remount,rw /dev/block/stl6 /system\n"); os.writeBytes("mv /system/app/SystemUI_Old.odex /system/app/SystemUI.odex\n"); os.writeBytes("mv /system/app/SystemUI_Old.apk /system/app/SystemUI.apk\n"); os.writeBytes("mount -o remount,ro /dev/block/stl6 /system\n"); String systemServerPID = GetSystemServerPID(); if (systemServerPID != null) os.writeBytes("kill " + systemServerPID + "\n"); // else ... manual reboot is required if systemServerPID fail. // Close the terminal os.writeBytes("exit\n"); os.flush(); p.waitFor(); } catch (Exception e) { ShowErrorGlobal(e); } } public String GetSystemServerPID() { try { Process p = Runtime.getRuntime().exec("ps -n system_server"); p.waitFor(); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); reader.readLine(); // Skip header. return reader.readLine().substring(10, 16).trim(); } catch (Exception e) { return null; } } protected void ShowErrorGlobal(Exception e) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream stream = new PrintStream( baos ); e.printStackTrace(stream); stream.flush(); new AlertDialog.Builder(this) .setIconAttribute(android.R.attr.alertDialogIcon) .setTitle("Epic fail") .setMessage("Error: " + new String( baos.toByteArray() )) .show(); } } 

虽然这并不回答“locking”屏幕的问题,但您可以通过使用setSystemUiVisibillity API(API级别11)来隐藏状态栏而不用root。

一些伪代码:

 public MyActivity extends Activity { @Override public void onCreate(Bundle savedInstance) { //... final View mainView = findViewById(R.id.you_main_view_id); mainView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); //Register a listener for when the status bar is shown/hidden: final Context context = getApplicationContext(); mainView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener () { @Override public void onSystemUiVisibilityChange(int visibility) { if ((visibility == View.SYSTEM_UI_FLAG_VISIBLE)) { //Do stuff here...pause the video/game? } else { //Do other stuff here..resume the video/game? } } }); } } 

这将隐藏状态栏,直到用户沿着屏幕的下边缘点击,在这种情况下,状态栏将显示(几秒钟后它会再次隐藏)。

确保在清单中指定了targetSdkVersion =“11”或更高。

应用程序HideBar可用于隐藏Android平板电脑(HC,ICS,JB)上的系统栏。 它包含一个可选的信息亭模式,可用于完全locking平板电脑和其他选项,如隐藏的后退button。 这是GPL软件。 如果此应用程序必须大量安装,请联系开发人员(我,请参阅应用程序网站上的电子邮件)。

对于其他有这个问题的人:

如果你没有在你的AndroidManaifest.xml文件中正确设置android:targetSdkVersion,setSystemUiVisibility没有任何作用(不像其他的高级API,无论targetSDKVersion是否设置正确)。

我不小心把我的targetSdkVersion放在了8号。立即将它撞到16,导致了setSystemUIVisiblity的效果。

是的如果您在设备上拥有root权限, 则可以这样做

这段代码可以隐藏和显示StatusBar,通过杀死它的进程并将其重新调用回来。

 package com.example.statusbar; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.Button; public class MainActivity extends Activity { String commandToExecute; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); commandToExecute = "/system/xbin/su"; executeShellCommand(commandToExecute); Button btHideStatusBar = (Button) findViewById(R.id.buttonHide); Button btShowStatusBar = (Button) findViewById(R.id.buttonShow); btHideStatusBar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { commandToExecute = "/system/xbin/su -c /system/bin/service call activity 42 s16 com.android.systemui"; executeShellCommand(commandToExecute); } }); btShowStatusBar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { commandToExecute = "/system/xbin/su -c /system/bin/am startservice -n com.android.systemui/.SystemUIService"; executeShellCommand(commandToExecute); } }); } private boolean executeShellCommand(String command) { try { Runtime.getRuntime().exec(command); return true; } catch (Exception e) { return false; } } } 

从4.4开始,你可以做到这一点(这个问题很古老,但总是出现在这个话题上):

setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE)

https://developer.android.com/training/system-ui/immersive.html

如果你想通过应用程序隐藏导航栏,那么这里是最简单的方法。 只需在清单文件中的应用程序标签中写入此代码即可

 > <Application > android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" <!-- > other parameters of application tag--> > > 

机器人:主题=“@安卓风格/ Theme.Black.NoTitleBar.Fullscreen

要么

mainView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE)

不,任务栏仍然存在,三个灰点代替经典图标