【问题标题】:Removing Android navigation and topbar,移除 Android 导航和顶栏,
【发布时间】:2017-06-10 22:14:09
【问题描述】:

我正在尝试在有根的 Android 设备上实现 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");

在我的活动中按下按钮时。但是什么都没有发生,也没有抛出异常。但是会弹出一个祝酒词,说该应用程序已被授予超级用户权限。

有什么想法吗?

【问题讨论】:

    标签: java android kiosk-mode


    【解决方案1】:

    要运行 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();
        }
    }
    

    要禁用系统用户界面,您可以运行此命令

    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");
    

    【讨论】:

    • 完美运行!谢谢!
    • 当我运行这个命令时,导航栏消失,但我不能再触摸屏幕了
    • @alexislg 你解决了这个不可触摸的屏幕问题吗?无法使其在 API 23+(棉花糖)上运行...
    • @GergelyKőrössy 是的。我用settings put secure user_setup_complete 0
    【解决方案2】:

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

    settings put secure user_setup_complete 0
    

    【讨论】:

    • 这不会移除导航栏只会禁用主页按钮。
    • 在我的设备上它会删除所有内容。我的应用处于沉浸式模式
    • 哦,我现在明白了。我认为它会像 service call activity ... 那样工作。
    【解决方案3】:

    分割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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-05
      • 2019-11-03
      相关资源
      最近更新 更多