Android-在4.2.2(Nexus10)上显示/隐藏系统栏

Android-在4.2.2(Nexus10)上显示/隐藏系统栏,android,root,android-4.2-jelly-bean,nexus-10,Android,Root,Android 4.2 Jelly Bean,Nexus 10,我对Nexus10-4.2.2有意见。我在Galaxy Tab 10.1和4.0.4上测试下面的代码,它运行良好: try { Process proc = Runtime.getRuntime().exec(new String[]{"sh","startservice","-n","com.android.systemui/.SystemUIService"}); proc.waitFor(); } catch (Exception e) { e.printSt

我对Nexus10-4.2.2有意见。我在Galaxy Tab 10.1和4.0.4上测试下面的代码,它运行良好:

try 
{
    Process proc = Runtime.getRuntime().exec(new String[]{"sh","startservice","-n","com.android.systemui/.SystemUIService"});
    proc.waitFor();
} 
catch (Exception e) 
{
    e.printStackTrace();
}

try
{
    //REQUIRES ROOT
    Process proc = Runtime.getRuntime().exec(new String[]{"su","-c","service call activity 42 s16 com.android.systemui"}); //WAS 79
    proc.waitFor();
}
catch(Exception ex)
{
    //Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show();
}

但是在Nexus 10上,系统栏在之后不会显示,只需隐藏即可。

要在4.2.2和其他版本上显示和隐藏系统栏和通知栏,请执行以下操作:

隐藏:

展示:


我认为您不应该通过
Runtime.exec()
使用系统调用来获得该结果。
您应该查看
FullscreenActivity
模板中的代码(源代码位于
/tools/templates/activities/FullscreenActivity/root
):这是一个完整的工作示例,展示了如何以编程方式显示/隐藏系统栏(顶部和底部),而且它甚至支持API 13+的动画。

goodm的回答很好,但我们大多数人都不知道envp

下面是完整的代码:

隐藏

try
{
    String command;
    command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib service call activity 42 s16 com.android.systemui";

    ArrayList<String> envlist = new ArrayList<String>();
    Map<String, String> env = System.getenv();
    for (String envName : env.keySet()) {
        envlist.add(envName + "=" + env.get(envName));
    }
    String[] envp = (String[]) envlist.toArray(new String[0]);
    Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command }, envp);
    proc.waitFor();
}
catch(Exception ex)
{
    Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show();
}
试试看
{
字符串命令;
command=“LD_LIBRARY_PATH=/vendor/lib:/system/lib服务调用活动42 s16 com.android.systemui”;
ArrayList envlist=新的ArrayList();
Map env=System.getenv();
for(字符串envName:env.keySet()){
添加(envName+“=”+env.get(envName));
}
字符串[]envp=(字符串[])envlist.toArray(新字符串[0]);
Process proc=Runtime.getRuntime().exec(新字符串[]{“su”,“-c”,command},envp);
进程waitFor();
}
捕获(例外情况除外)
{
Toast.makeText(getApplicationContext(),例如getMessage(),Toast.LENGTH_LONG.show();
}

你可以用类似的方法来作秀。

我不明白你在说什么:S请处理gramar(某人?)别介意,我刚刚找到了解决方案。@goodm我也面临同样的问题,你能更新代码吗,你是如何克服这个问题的。@kumarsu我的代码下面会更新,如果你使用Eclipse+ADT,您可以使用模板向导在Android项目中生成该示例活动:菜单
File>New>Android>Android对象>全屏活动
不用担心我可以处理这个步骤;)对不起,可能有点过分了,我知道:)使用太阳穴的唯一缺点是,你必须覆盖音量按钮,因为每次点击后,底部系统栏都会恢复,无论你做什么,长按电源后,底部栏会恢复。所以最后我可能不得不使用我的方法,因为这将是一个kiosk应用程序,所以我需要尽可能多地限制用户。这需要Root吗?envp是如何初始化的?是否可以使用没有envp的版本?是否需要向清单中添加任何权限?我们还需要在系统目录中安装此APK才能工作吗?我正在根设备上的kitkat上尝试这段代码,但它似乎不起作用。我刚拿到一张支票例外,这需要根。
    try 
    {
         String command;
         command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib am startservice -n com.android.systemui/.SystemUIService";
         Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command }, envp);
         proc.waitFor();
    } 
    catch (Exception e) 
    {
          e.printStackTrace();
    }
try
{
    String command;
    command = "LD_LIBRARY_PATH=/vendor/lib:/system/lib service call activity 42 s16 com.android.systemui";

    ArrayList<String> envlist = new ArrayList<String>();
    Map<String, String> env = System.getenv();
    for (String envName : env.keySet()) {
        envlist.add(envName + "=" + env.get(envName));
    }
    String[] envp = (String[]) envlist.toArray(new String[0]);
    Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command }, envp);
    proc.waitFor();
}
catch(Exception ex)
{
    Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_LONG).show();
}