Скрытие пользовательского интерфейса системы на Lollipop

У меня есть приложение режима киоска, которое скрывает все следы системного интерфейса (панель уведомлений и кнопки навигации). В версиях Android pre-Lollipop следующее работает отлично (как root):

service call activity 42 s16 com.android.systemui

В Lollipop, однако, это делает экран полностью черным, а также скрывает системный интерфейс. По этой причине он не может быть использован.

Кто-нибудь знает об обходном пути для этого?

Я попробовал решение Device Owner/Admin для Screen Pinning, но, к сожалению, это неприемлемо, поскольку он полностью не скрывает системный интерфейс, но оставляет кнопку "назад" видимой, когда прокручивается в нижней части экрана.

Ответы

Ответ 1

Если устройство включено, вы можете отключить systemui pm disable-user com.android.systemui, а затем метод владельца устройства работает нормально.

Этот метод не следует использовать, если устройство запускает другие приложения, потому что, если ваше приложение выйдет из строя, systemui может быть отключен, и пользователь не может взаимодействовать с устройством.

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
&device-owner package="com.mycompany" name="*mycompany" />

Ответ 2

Я использовал установленную ниже настройку, чтобы избавиться от системного интерфейса в Android Marshmallow

final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_FULLSCREEN
        | View.SYSTEM_UI_FLAG_IMMERSIVE;

и OnCreate у меня есть

this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_instructions);
getWindow().getDecorView().setSystemUiVisibility(flags);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

Затем я добавил код для скрытия клавиши, если пользователь переместит верхний или нижний экран.

/* Hides Navigation bar again if user swipes it visible */
@Override
protected void onResume() {
        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(
                new View.OnSystemUiVisibilityChangeListener() {
                    @Override
                    public void onSystemUiVisibilityChange(int visibility) {
                    getWindow().getDecorView().setSystemUiVisibility(flags);
                    }
                });
    super.onResume();
    Log.i(TAG,"Activity Life Cycle : onResume : MainActivity Resumed");
}

Это отобразит красную кнопку на экране и вернет ее обратно. Только проблема в том, что если вы открываете новую активность поверх операции Pinned. Он не получает никаких указаний onResume.

Ответ 3

Вероятно, вы хотите использовать режим "Погружения". Вы найдете всю необходимую информацию здесь

У вас есть пример здесь, для каждой версии Android!

Ответ 4

У меня была такая же проблема. Этот код будет работать для 4.4 и Lollipop (Tested). Должен также работать и с другими версиями.

 /**
     * Uses Root access to enable and disable SystemUI.
     * @param enabled Decide whether to enable or disable.
     */
    public void setSystemUIEnabled(boolean enabled){
        try {
            Process p = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            os.writeBytes("pm " + (enabled ? "enable" : "disable")
                    + " com.android.systemui\n");
            os.writeBytes("exit\n");
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Конечно, для этого требуется root

Ответ 5

Я нашел это другое решение, и он работает на android 5.0

private void hideNavigationBar(){
        try {
            Process process = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(process.getOutputStream());
            os.writeBytes("pm disable com.android.systemui\n");
            os.flush();
            os.writeBytes("exit\n");
            os.flush();
            process.waitFor();
            //////////////////////////////////////
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }