Скрытие пользовательского интерфейса системы на 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();
}
}