删除Android导航和顶部栏,

时间:2017-01-25 16:20:59

标签: java android kiosk-mode

我正在尝试在root设备上实现Kiosk应用,我需要完全禁用导航和状态栏。

这些命令适用于adb shell

禁用:

service call activity 42 s16 com.android.systemui

启用:

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

那很好!现在我需要能够从我的应用程序中执行此操作。所以要禁用我尝试过:

Process process = Runtime.getRuntime().exec("su service call activity 42 s16 com.android.systemui");

在我的活动中按下按钮时。但没有任何反应,也没有例外。然后突然出现了一个吐司,说应用程序已获得超级用户权限。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

要运行su cmd,您可以使用此

public static void runCmd(String cmd) {
    DataOutputStream os;
    try {
        Process process = Runtime.getRuntime().exec("su");
        os = new DataOutputStream(process.getOutputStream());
        os.writeBytes(cmd + "\n");
        os.writeBytes("exit\n");
        os.flush();
        os.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

要禁用系统ui,您可以运行此命令

runCmd("pm disable com.android.systemui && service call activity 42 s16 com.android.systemui");

如果您想启用

runCmd("pm enable com.android.systemui && am startservice -n com.android.systemui/.SystemUIService");

答案 1 :(得分:1)

使用Android 5和6,您可以尝试这个技巧:

settings put secure user_setup_complete 0

答案 2 :(得分:0)

拆分su调用和命令调用:

try{
    Process su = Runtime.getRuntime().exec("su");
    DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());

    outputStream.writeBytes("service call activity 42 s16 com.android.systemui");
    outputStream.flush();

    outputStream.writeBytes("exit\n");
    outputStream.flush();
    su.waitFor();
}catch(IOException e){
    throw new Exception(e);
}catch(InterruptedException e){
    throw new Exception(e);
}