Навсегда скрыть строку состояния Android
Я пытаюсь скрыть системную строку состояния на устройстве Android 4.4. Это для режима киоска, где мое приложение будет единственным приложением, когда-либо запущенным на устройстве. Целевым устройством на данный момент является Nexus 7 2013 года.
Устройство рутировано, и я смог полностью удалить нижнюю панель навигации с некоторой информацией из этого поста.
Для верхней строки состояния все, что я пробовал, только временно скрывает панель. Если мои пользователи перемещаются вниз в верхней части экрана, снова появляется строка состояния. Я не хочу позволять им видеть время, заходить в настройки или даже видеть уведомления.
Сообщения, которые я нашел и уже попробовал:
- Скрыть системную панель в планшетах
- Навсегда скрыть панель навигации по активности
- Скрыть строку состояния на Android
- Отключить / Скрыть строку состояния в Android
Какие-либо предложения?
В идеале я бы хотел иметь возможность отредактировать build.prop для этого, поскольку я уже делаю это для панели навигации и могу сделать это одновременно. Я пытаюсь не создавать свой собственный образ андроида.
Обновить:
После некоторой дополнительной работы это, кажется, в некоторой степени зависит от точной сборки Android или устройства, на котором он работает.
Некоторые устройства, такие как серия Nexus, с которой я работал, позволяют пользователю проводить пальцем, чтобы панель снова появилась.
Тем не менее, я недавно попробовал это на Verizon Eclipse, и панель не появляется снова, что я и искал.
Я все еще ищу лучшее решение для всех устройств, но, вероятно, все сводится к созданию собственной сборки Android.
9 ответов
Мы не могли предотвратить появление статуса в полноэкранном режиме на устройствах kitkat, поэтому сделали хак, который все еще удовлетворяет требованию, т.е. блокирует расширение строки состояния.
Чтобы это работало, приложение не было полноэкранным. Мы наложили на строку состояния и использовали все входные события. Это препятствовало расширению статуса.
нота:
- customViewGroup - это пользовательский класс, который расширяет любой макет (фрейм, относительный макет и т. д.) и использует событие касания.
- для использования события касания переопределяет метод onInterceptTouchEvent группы представлений и возвращает true
обновленный
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Код реализации customViewGroup:
WindowManager manager = ((WindowManager) getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE));
WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
localLayoutParams.gravity = Gravity.TOP;
localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
// this is to enable the notification to recieve touch events
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
// Draws over status bar
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
localLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
localLayoutParams.height = (int) (50 * getResources()
.getDisplayMetrics().scaledDensity);
localLayoutParams.format = PixelFormat.TRANSPARENT;
customViewGroup view = new customViewGroup(this);
manager.addView(view, localLayoutParams);
Надеюсь, это поможет вам
Я попробовал обходной путь, предоставленный @gonglong, но я не был доволен результатом из-за вспышки в пользовательском интерфейсе, так как обходной путь наступил.
Вместо этого я смог сделать это как root:
settings put secure user_setup_complete 0
Я думаю, что на обычном устройстве это может привести к начальной настройке устройства, но на моих устройствах я удалил этот APK из системы, чтобы этого не произошло.
Это не документировано нигде, где я могу найти, но имеет хороший эффект, когда пользовательский интерфейс с верхними настройками не может быть перетащен вниз. Область уведомлений все еще можно перетащить вниз.
Другой параметр, который я нашел полезным, был:
settings put global device_provisioned 0
Это скрывает параметры "Режим полета" и "Тихий режим" в меню "Питание", что является дополнительным бонусом для моего приложения.
Побочных эффектов может быть больше, но я еще не нашел ничего, что имело бы значение для меня.
Полный список
Этот список был взят из Nexus 7 2013 LTE под управлением нового Android 4.4.3 (KTU84L). Число в квадратных скобках - это значение, когда я извлекал файл БД, который был после базовой настройки устройства и включения разработчика /USB, но до внесения любых других изменений в настройки
Этот файл был найден на data/data/com.android.providers.settings/databases/settings.db
Примечание: некоторые URL-адреса требуют добавления дополнительного пробела для обхода фильтров SO
system
Пространство имен
- volume_music [11]
- volume_ring [5]
- volume_system [7]
- volume_voice [4]
- volume_alarm [6]
- Volume_notification [5]
- volume_bluetooth_sco [7]
- mode_ringer_streams_affered [174]
- mute_streams_affered [46]
- vibrate_when_ringing [0]
- dim_screen [1]
- dtmf_tone_type [0]
- слух_ [0]
- tty_mode [0]
- яркость экрана [87]
- screen_brightness_mode [1]
- window_animation_scale [1.0]
- transition_animation_scale [1.0]
- accelerometer_rotation [1]
- haptic_feedback_enabled [1]
- tification_light_pulse [1]
- dtmf_tone [1]
- sound_effects_enabled [1]
- lockscreen_sounds_enabled [1]
- pointer_speed [0]
- alarm_alert [content:// media / internal / audio / media / 11]
- messages_sound [content://media/internal/audio/media/27]
- рингтон [контент:// медиа / внутренний / аудио / медиа / 35]
- next_alarm_formatted []
- radio.data.stall.recovery.action [0]
- screen_off_timeout [30000]
global
Пространство имен
- flight_mode_on [0]
- flight_mode_radios [сотовый,bluetooth,wifi,nfc,wimax]
- plane_mode_toggleable_radios [Bluetooth, Wi-Fi, NFC]
- auto_time [1]
- auto_time_zone [1]
- stay_on_ while_plugged_in [0]
- wifi_sleep_policy [2]
- mode_ringer [2]
- package_verifier_enable [1]
- wifi_networks_available_notification_on [1]
- bluetooth_on [0]
- cdma_cell_broadcast_sms [1]
- data_roaming [0]
- mobile_data [1]
- netstats_enabled [1]
- install_non_market_apps [0]
- usb_mass_storage_enabled [1]
- wifi_max_dhcp_retry_count [9]
- wifi_display_on [0]
- lock_sound [/system/media/audio/ui/Lock.ogg]
- unlock_sound [/system/media/audio/ui/Unlock.ogg]
- power_sounds_enabled [1]
- low_battery_sound [/system/media/audio/ui/LowBattery.ogg]
- dock_sounds_enabled [0]
- desk_dock_sound [/system/media/audio/ui/Dock.ogg]
- desk_undock_sound [/system/media/audio/ui/Undock.ogg]
- car_dock_sound [/system/media/audio/ui/Dock.ogg]
- car_undock_sound [/system/media/audio/ui/Undock.ogg]
- wireless_charging_started_sound [/system/media/audio/ui/WirelessChargingStarted.ogg]
- dock_audio_media_enabled [1]
- set_install_location [0]
- default_install_location [0]
- аварийный_тон [0]
- call_auto_retry [0]
- предпочитаемый_сетевой_мод [9]
- subscription_mode [1]
- low_battery_sound_timeout [3600000]
- wifi_watchdog_on [1]
- audio_safe_volume_state [1]
- send_action_app_error [1]
- web_autofill_query_url [http:// android.clients.google.com/proxy/webautofill]
- sms_short_codes_content_url [ http://www.gstatic.com/android/config_update/07172013-sms-blacklist.txt%5D
- sms_short_codes_metadata_url [ http://www.gstatic.com/android/config_update/07172013-sms-metadata.txt%5D
- cert_pin_metadata_url [ http://www.gstatic.com/android/config_update/10142013-metadata.txt%5D
- cert_pin_content_url [ http://www.gstatic.com/android/config_update/10142013-pins.txt%5D
- wifi_on [1]
- assisted_gps_enabled [1]
- wifi_scan_always_enabled [1]
- device_provisioned [1]
- bugreport_in_power_menu [0]
- development_settings_enabled [1]
- adb_enabled [1]
- wifi_country_code [us]
secure
Пространство имен
- wifi_watchdog_watch_list [GoogleGuest]
- mock_location [0]
- backup_enabled [0]
- backup_transport [com.google.android.backup /.BackupTransportService]
- mount_play_not_snd [1]
- mount_ums_autostart [0]
- mount_ums_prompt [1]
- mount_ums_notify_enabled [1]
- accessibility_script_injection [0]
- accessibility_web_content_key_bindings [0x13 = 0x01000100; 0x14 = 0x01010100; 0x15 = 0x02000001; 0x16 = 0x02010001; 0x200000013 = 0x02000601; 0x200000014 = 0x02010601; 0x200000015 = 0x03020101; 0x200000016 = 0x03010201; 0x200000023 = 0x02000301; 0x200000024 = 0x02010301; 0x200000037 = 0x03070201; 0x200000038 = 0x03000701: 0x03010701: 0x03020701;]
- long_press_timeout [500]
- touch_exploration_enabled [0]
- говорить_пароль [0]
- accessibility_script_injection_url [ https://ssl.gstatic.com/accessibility/javascript/android/AndroidVox_v1.js%5D
- lockscreen.disabled [0]
- screensaver_enabled [1]
- screensaver_activate_on_dock [1]
- screensaver_activate_on_sleep [0]
- screensaver_components [com.google.android.deskclock / com.android.deskclock.Screensaver]
- screensaver_default_component [com.google.android.deskclock / com.android.deskclock.Screensaver]
- accessibility_display_magnification_enabled [0]
- accessibility_display_magnification_scale [2.0]
- accessibility_display_magnification_auto_update [1]
- android_id [a0ef8b2a9ade982c]
- enabled_input_methods [com.google.android.inputmethod.latin / com.android.inputmethod.latin.LatinIME: com.google.android.googlequicksearchbox / com.google.android.voicesearch.ime.VoiceInputMethodService]
- input_methods_subtype_history []
- selected_input_method_subtype [-1]
- selected_spell_checker [com.google.android.inputmethod.latin / com.android.inputmethod.latin.spellcheck.AndroidSpellCheckerService]
- selected_spell_checker_subtype [0]
- lock_screen_owner_info_enabled [0]
- voice_recognition_service [com.google.android.googlequicksearchbox / com.google.android.voicesearch.serviceapi.GoogleRecognitionService]
- default_input_method [com.google.android.inputmethod.latin / com.android.inputmethod.latin.LatinIME]
- enabled_print_services [com.google.android.apps.cloudprint / com.google.android.apps.cloudprint.printdialog.services.CloudPrintService: com.hp.android.printservice / com.hp.android.printservice.ServiceAndroidPrint]
- enabled_on_first_boot_system_print_services [com.google.android.apps.cloudprint / com.google.android.apps.cloudprint.printdialog.services.CloudPrintService: com.hp.android.printservice / com.hp.android.printservice.ServiceAndroidPrint]
- bluetooth_name [Nexus 7]
- masterLocationPackagePrefixBlacklist [com.google., com.semaphoremobile.zagat.android]
- serial_blacklist [827,864]
- dropbox: data_app_anr [отключено]
- dropbox: data_app_wtf [отключено]
- ssl_session_cache [файл]
- pubkey_blacklist [5f3ab33d55007054bc5e3e5553cd8d8465d77c61,783333c9687df63377efceddd82efa9101913e8e]
- facelock_liveliness_recognition_threshold [2.2]
- facelock_detection_threshold [0.0]
- dropbox: data_app_crash [отключено]
- masterLocationPackagePrefixWhitelist [com.google.android.gms]
- lockscreen.options [enable_facelock]
- facelock_max_center_movement [10.0]
- bluetooth_address [AC: 22: 0B: A5: AF: 3D]
- bluetooth_addr_valid [1]
- config_update_certificate [ усеченное содержимое base64 ]
- location_providers_allowed [GPS, сеть]
- allow_geolocation_origins [ http://www.google.co.uk/ http:// www.google.com]
- locationPackagePrefixBlacklist []
- user_setup_complete [1]
- locationPackagePrefixWhitelist []
- last_setup_shown [eclair_1]
Я знаю, что это старый вопрос, но, надеюсь, он кому-нибудь поможет. Вот два очень простых вызова для отключения и включения строки состояния, которые я использовал ранее. Может использоваться из командной строки или выполняться приложением Java:
Отключение:
service call activity 42 s16 com.android.systemui
Включить:
am startservice -n com.android.systemui/.SystemUIService
Я использовал этот ответ, чтобы скрыть программные клавиши: /questions/34441437/polnostyu-otklyuchit-skryit-stroku-sostoyaniya-na-442/34441445#34441445
И для отключения StatusBar (это может повредить ваше устройство, так что делайте это осторожно. Я несколько раз разрушал свое устройство, прежде чем мне удалось это сделать) Протестировано на Asus Tinker Board, Android 6:
- Загрузите apktool здесь https://bitbucket.org/iBotPeaches/apktool/downloads/ и добавьте его в
path
в твоем любимом виде вытащить
SystemUI.apk
с вашего устройства:adb pull /system/priv-app/SystemUI/SystemUI.apk
путь кSystemUI.apk
может быть другимвытащить
framework-res.apk
с вашего устройстваadb pull /system/framework/framework-res.apk
путь кframework-res.apk
может быть другимбежать
apktool if framework-res.apk
бежать
apktool if SystemUI.apk
бежать
apktool d SystemUI.apk
открыто
SystemUI\res\layout\status_bar.xml
и добавитьandroid:visibility="gone"
на самый верхний элемент XML (для меня это былоcom.android.systemui.statusbar.phone.PhoneStatusBarView
)бежать
apktool b SystemUI
Идти к
SystemUI\original
и скопироватьAndroidManifest.xml
а такжеMETA-INF
вSystemUI\build\apk\
бежать
apktool b SystemUI
сноваИдти к
SystemUI\dist\
и переопределить оригинал устройстваSystemUI.apk
с одним вSystemUI\dist\SystemUI.apk
сadb push SystemUI\dist\SystemUI.apk /system/priv-app/SystemUI/SystemUI.apk
Перезагрузите устройство
На основе этой темы https://forum.xda-developers.com/showthread.php?t=2203166
У меня нет идеального решения, но здесь есть обходной путь. Основная идея заключается в том, чтобы прослушивать изменения состояния пользовательского интерфейса системы и заставить навигацию / строку состояния отображаться как невидимые. Это действует так же, как установка режима IMMERSIVE_STICKY, но исчезает с навигационной панели / строки состояния быстрее, чем IMMERSIVE_STICKY.
вот:
установить стиль пользовательского интерфейса системы в onCreate() и функции onResume, а также установить прослушиватель изменения пользовательского интерфейса системы
mDecroView.setSystemUiVisibility(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);
mDecroView.setOnSystemUiVisibilityChangeListener(this);
сделать системную панель невидимой в onSystemUiVisibilityChange, установив системный интерфейс через несколько секунд, в противном случае он вступит в силу (точно не знает, почему, возможно, система просто игнорирует запрос настройки системного интерфейса пользователя, когда системная панель еще не завершена)
public void onSystemUiVisibilityChange(int visibility) {
// TODO Auto-generated method stub
Log.d(TAG, "onSystemUiVisibilityChange called with visibility " + visibility);
if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0){
if(null == mHandler){
mHandler = new MyHandler();
}
if(null != mHandler){
mHandler.removeMessages(MSG_HIDE_SYSTEM_BAR);
mHandler.sendEmptyMessageDelayed(MSG_HIDE_SYSTEM_BAR, 50);
}
//the deccro view is not in full screen
Log.d(TAG, "setSystemUiVisibility");
Log.d(TAG, "current system ui is " + mDecroView.getSystemUiVisibility());
}
}
тогда вы можете установить системный интерфейс следующим образом:
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch(msg.what){
case MSG_HIDE_SYSTEM_BAR:
mDecroView.setSystemUiVisibility(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);
break;
}
}
Отличное решение, которое я нашел для этой проблемы, установив каждый вид деятельности theme
& windowSoftInputMode
до следующих значений:
<activity android:name=".MyActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:windowSoftInputMode="adjustResize"> <!-- theme : to set the activity to a full screen mode without a status bar(like in some games) -->
</activity> <!-- windowSoftInputMode : to resize the activity so that it fits the condition of displaying a softkeyboard -->
за дополнительной информацией обращайтесь сюда.
Попробуйте этот код:
отключить строку состояния и панель навигации
adb shell
su
pm disable com.android.systemui
reboot
включить строку состояния и панель навигации
adb shell
su
pm enable com.android.systemui
reboot
Он работает на Android 5.1.1, но USB-камера не работает
Другой способ (у меня аппарат работал без проблем)
Удаление панели навигации системы ¶ Панель навигации системы Android - это панель в нижней части экрана, на которой представлены программные клавиши возврата, возврата и переключения приложений.
Поскольку системная панель навигации не зависит, в частности, от какого-либо установленного приложения Android, ее удаление выполняется в ОС Android.
Для этого на устройстве с рутированным доступом вы можете установить для свойства qemu.hw.mainkeys значение 1, отредактировав /system/build.prop:
qemu.hw.mainkeys=1
Чтобы выполнить это во время сборки, вы должны установить значение config_showNavigationBar в false в оверлее вашего устройства (например, device / gateworks / ventana / overlay / frameworks / base / core / res / res / values /config.xml):
<bool name="config_showNavigationBar">false</bool>
Обратите внимание, что вы также можете внести изменения в build.prop во время сборки, добавив к переменным PRODUCT_DEFAULT_PROPERTY_OVERRIDES или ADDITIONAL_BUILD_PROPERTIES, которые можно найти в целевой конфигурации вашего устройства (например, imx6.mk и BoardConfig.mk в device/gateworks/ventana/).
Кроме того, вы можете скрыть панель навигации (и строку состояния) в приложении, установив флаг SYSTEM_UI_FLAG_HIDE_NAVIGATION, однако он вернется, если пользователь коснется любого места на экране. http://trac.gateworks.com/wiki/Android/Kiosk
Для корневых устройств я использую следующий код, чтобы изменить видимость из моих приложений. Он устанавливает видимость системного пользовательского интерфейса, а затем перезагружает устройство, чтобы изменения настроек действительно произошли. Вы также можете использовать "pm"hide"com.android.systemui" ... через adb, конечно.
Обратите внимание, что на некоторых старых устройствах параметры команды были «включить » / «отключить» . Для более новых версий Android (9+) я заметил, что у меня работали только «показать» и «скрыть» .
fun setSystemUiEnabled(enabled: Boolean) {
try {
val p = Runtime.getRuntime().exec("su")
val os = DataOutputStream(p.outputStream)
os.writeBytes(
"pm ${if (enabled) "unhide" else "hide"} com.android.systemui\n"
)
os.writeBytes("reboot\n")
os.writeBytes("exit\n")
os.flush()
} catch (e: IOException) {
Timber.w(e, "Error while setting system-ui enabled-state to $enabled")
e.printStackTrace()
}
}
Добавьте это раньше: setContentView(R.layout.x);
this.requestWindowFeature(Window.FEATURE_NO_TITLE); // Removes title bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.x);