2015-01-14 3 views
15

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

service call activity 42 s16 com.android.systemui 

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

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

Я пробовал решение владельца устройства/администратора для экранирования экрана, но, к сожалению, это неприемлемо, потому что он не скрывает системный интерфейс полностью, но оставляет кнопку «Назад» видимой при прокрутке в нижней части экрана.

+0

Это далеко не идеальное решение, но одна вещь, которую вы можете сделать, это по крайней мере отключить кнопку «Назад» (перехватить метод onBackPressed() в вашей деятельности), чтобы пользователь не мог оставить ваше приложение таким образом. –

+0

Да, я тоже это делаю для устройств с физическими кнопками; но для нашего конкретного режима брендинга/киоска не должно быть никакого системного интерфейса на всех видимых. – tristan2468

ответ

8

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

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

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

Это на самом деле то, как я работал над проблемой, за исключением того, что я использовал 'pm disable com.android.systemui' и не нуждался в использовании владельца устройства, так как мое приложение является единственным домашним приложением на устройстве. – tristan2468

+0

Да, вы не хотите использовать эту услугу, может случиться, что ваше устройство будет нестабильно, если ваше приложение перейдет в состояние сбоя.Вы посмотрели в полноэкранном режиме? – JoJoPla

+0

@ tristan2468, я использую тот же вызов «активность вызова вызова 42 s16 com.android.systemui» в своем приложении и получаю черный экран на Android 5.0. Я попробовал '' 'pm disable com.android.systemui''', но это ничего не делает на моем устройстве. Вы в итоге использовали комбинацию этих команд на 5.0? и да, мое устройство коренится. –

0

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

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

+0

Иммерсивного режима недостаточно для моего конкретного прецедента. Он предназначен для того, чтобы приложение могло перейти в полноэкранный режим psuedo, но пользователь всегда может показать, что системный пользовательский интерфейс касается только верхней или нижней части экрана. Этого недостаточно для полного режима киоска. – tristan2468

0

У меня была такая же проблема. Этот код будет работать для 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(); 
     } 
    } 

Конечно, это требует корневого

0

Я нашел другое решение, и это работает на 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(); 
     } 
    } 
+0

Это идентично по функциональности принятому ответу. – tristan2468

1

я использовал набор следующие настройки, чтобы избавиться от System UI в Android Зефир

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.

Смежные вопросы