Навсегда скрыть строку состояния Android

Я пытаюсь скрыть системную строку состояния на устройстве Android 4.4. Это для режима киоска, где мое приложение будет единственным приложением, когда-либо запущенным на устройстве. Целевым устройством на данный момент является Nexus 7 2013 года.

Устройство рутировано, и я смог полностью удалить нижнюю панель навигации с некоторой информацией из этого поста.

Для верхней строки состояния все, что я пробовал, только временно скрывает панель. Если мои пользователи перемещаются вниз в верхней части экрана, снова появляется строка состояния. Я не хочу позволять им видеть время, заходить в настройки или даже видеть уведомления.

Сообщения, которые я нашел и уже попробовал:

Какие-либо предложения?

В идеале я бы хотел иметь возможность отредактировать 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);
Другие вопросы по тегам