以编程方式在 AOSP 构建上启用禁用系统 UI

Enable Disable System UI on AOSP Build programmatically

我已经使用 Android 4.4.4 源构建了我的 AOSP 自定义 ROM。我想做一个信息亭模式应用程序(总是全屏 - 用户不可能离开它或切换到另一个应用程序)。

为了拥有完全身临其境的模式,我遵循了这个 SO post Enabling KioskMode in Android 4.4.2 with Root

我完全按照他们说的做了,但它不起作用。系统 UI 没有被禁用,我没有错误。

所以我决定创建一个 .sh 文件,我 运行 来自 Android SDK 代码:

Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "/etc/stop-ui.sh" });

效果很好。但是当我想再次启动系统 UI 时: Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "/etc/start-ui.sh" }); 它 returns 错误 1.

当我从 adb shell 运行 /etc/start-ui.sh 工作时。

这是我的 stop.sh(权限为 555)文件:

#!/system/bin/sh
service call activity 42 s16 com.android.systemui

这是我的 start.sh(权限为 555)文件:

#!/system/bin/sh
am startservice -n com.android.systemui/.SystemUIService

我的应用是系统应用(我用的是平台签名)

结论:我可以从 shell 重新启动系统 UI,但不能以编程方式从应用程序重新启动系统 UI

我有这 2 种方法(在 root phone 上)并且它们工作得很好:

public static void hideSystemUi(){
    try {
        Build.VERSION_CODES vc = new Build.VERSION_CODES();
        Build.VERSION vr = new Build.VERSION();
        String ProcID = "79"; //HONEYCOMB AND OLDER

        //v.RELEASE  //4.0.3
        if(vr.SDK_INT >= vc.ICE_CREAM_SANDWICH){
            ProcID = "42"; //ICS AND NEWER
        }
        Process proc = Runtime.getRuntime().exec(new String[]{
                "su","-c","service call activity " + ProcID + " s16 com.android.systemui"});

        proc.waitFor();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void showSystemUi(){
    try {
        Process proc = Runtime.getRuntime().exec("am startservice --user 0 -n com.android.systemui/.SystemUIService");
        proc.waitFor();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

尝试在 am startservice -n com.android.systemui/.SystemUIService 命令中传递用户 ID。在我的例子中,它是 0(根用户 ID)。