Включить отключение пользовательского интерфейса системы в сборке AOSP программно

Я создал свой собственный ПЗУ AOSP, используя исходники Android 4.4.4. Я хочу сделать приложение в режиме киоска (всегда в полноэкранном режиме - пользователь не может выйти из него или переключиться на другое приложение).

Чтобы иметь режим полного погружения, я следовал этому сообщению SO Включение KioskMode в Android 4.4.2 с root-правами

Я делаю точно так, как они говорят, но это не работает. Системный пользовательский интерфейс не отключен, и у меня нет ошибки.

Поэтому я решил создать файл .sh, который я запускаю из кода Android SDK:

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

Это работает отлично. Но когда я хочу снова запустить системный пользовательский интерфейс: Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "/etc/start-ui.sh" }); он возвращает ошибку 1.

Когда я запускаю /etc/start-ui.sh из оболочки adb, он работает.

Вот мой файл 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

Мое приложение является системным (я подписал его подписью платформы)

Вывод: я могу перезапустить системный интерфейс из оболочки, но не из приложения программно


person alexislg    schedule 16.12.2015    source источник


Ответы (1)


У меня было 2 метода (на рутированном телефоне), и они отлично работали:

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. В моем случае это 0 (идентификатор пользователя root).

person Veaceslav Gaidarji    schedule 18.12.2015
comment
Ничего себе, спасибо, это работает с добавлением --user 0. Это странно. Почему без него не работает? Во многих других сообщениях SO у людей нет опции --user 0, и она работает. Спасибо, кстати, вы мне очень помогли. - person alexislg; 19.12.2015
comment
Первый способ работает, а второй нет. Вернуть systemUI даже вручную было непросто :( - person Igor Skryl; 31.10.2016
comment
Если я запускаю активность вызова службы 42 s16 com.android.systemui, systemUi исчезает, но устройства больше не принимают никаких входных данных. am startservice -n com.android.systemui/.SystemUIService - person maggocnx; 21.08.2017