web-dev-qa-db-fra.com

Masquer en permanence la barre d'état Android

J'essaie de masquer la barre d'état du système sur un appareil Android 4.4. Ceci est pour un mode kiosque où mon application sera la seule application jamais exécutée sur l'appareil. L’appareil cible pour l’instant est un Nexus 7 2013.

L'appareil est enraciné et j'ai pu supprimer complètement la barre de navigation inférieure avec certaines informations de this post .

Pour la barre d'état supérieure, tout ce que j'ai essayé cache uniquement temporairement la barre. Si mes utilisateurs se déplacent en haut de l'écran, la barre d'état réapparaît. Je ne veux pas leur permettre de voir l'heure, d'obtenir les paramètres ou même de voir les notifications.

Messages que j'ai trouvés et déjà essayés:

Aucune suggestion?

Idéalement, j'aimerais pouvoir éditer build.prop pour le faire, car je le fais déjà pour la barre de navigation et je pourrais le faire en même temps. J'essaie de ne pas avoir à créer ma propre image Android.

Mettre à jour:

Après un peu plus de travail, cela semble dépendre un peu de la version exacte d’Android ou du périphérique sur lequel il tourne.

Certains périphériques, tels que la série Nexus sur laquelle je travaille, permettent à l'utilisateur de faire glisser le curseur pour faire réapparaître la barre.

Cependant, j'ai récemment essayé ceci sur un Verizon Eclipse, et la barre ne réapparaît pas, c'est ce que je recherchais.

Je cherche toujours une meilleure solution pour cibler tous les appareils, mais ce sera probablement créer ma propre version d'Android.

35
dtyler

Nous n'avons pas pu empêcher le statut d'apparaître en mode plein écran sur les périphériques KitKat. Nous avons donc créé un hack qui convient toujours, c.-à-d. Que la barre d'état ne se développe pas.

Pour que cela fonctionne, l'application n'a pas été rendue en plein écran. Nous plaçons une superposition sur la barre d'état et utilisons tous les événements en entrée. Cela empêchait l'expansion du statut.

Remarque:

  • customViewGroup est une classe personnalisée qui étend toute disposition (cadre, disposition relative, etc.) et utilise un événement tactile. 
  • pour consommer un événement tactile, substituez la méthode onInterceptTouchEvent du groupe de vues .__ et renvoyez true

Mis à jour

<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW"/> 

implémentation customViewGroup Code:

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);

J'espère que cela vous aide

30
Abhimaan

Je sais que c'est une vieille question, mais j'espère que cela aidera quelqu'un. Voici deux appels très simples pour désactiver et activer la barre d’état que j’avais utilisée auparavant. Peut être utilisé à partir de la ligne de commande ou exécuté par une application Java:

Désactiver:

service call activity 42 s16 com.Android.systemui

Activer:

am startservice -n com.Android.systemui/.SystemUIService
18
D. Gibbs

I did try the workaround provided by @gonglong, but I wasn't happy with the result because of a flash in the UI as the workaround kicked in.

Instead, I was able to do this as root:

settings put secure user_setup_complete 0

I think on a normal device, this would cause the initial device setup to start, but on my devices, I've removed that APK from system so that doesn't happen.

This isn't documented anywhere I can find, but has a nice effect, where the top settings UI can't be dragged down. The notifications area can still be dragged down.

Another setting that I found useful was:

settings put global device_provisioned 0

This hides the Airplane Mode and Silent Mode options from the Power menu, which is an added bonus for my application.

There might be more side effects, but I've yet to find any that matter to me.

Full List

This list was taken from a Nexus 7 2013 LTE running brand new Android 4.4.3 (KTU84L). The number in square brackets is the value when I pulled the db file, which was after basic setup device setup and enabling developer/USB, but before making any other changes in settings

This file was found at data/data/com.android.providers.settings/databases/settings.db

Note: Some URLS required adding an extra space character to bypass SO filters

system namespace

  • 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_affected [174]
  • mute_streams_affected [46]
  • vibrate_when_ringing [0]
  • dim_screen [1]
  • dtmf_tone_type [0]
  • hearing_aid [0]
  • tty_mode [0]
  • screen_brightness [87]
  • screen_brightness_mode [1]
  • window_animation_scale [1.0]
  • transition_animation_scale [1.0]
  • accelerometer_rotation [1]
  • haptic_feedback_enabled [1]
  • notification_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]
  • notification_sound [content://media/internal/audio/media/27]
  • ringtone [content://media/internal/audio/media/35]
  • next_alarm_formatted []
  • radio.data.stall.recovery.action [0]
  • screen_off_timeout [30000]

global namespace

  • airplane_mode_on [0]
  • airplane_mode_radios [cell,bluetooth,wifi,nfc,wimax]
  • airplane_mode_toggleable_radios [bluetooth,wifi,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]
  • emergency_tone [0]
  • call_auto_retry [0]
  • preferred_network_mode [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]
  • sms_short_codes_metadata_url [http://www.gstatic.com/android/config_update/07172013-sms-metadata.txt]
  • cert_pin_metadata_url [http://www.gstatic.com/android/config_update/10142013-metadata.txt]
  • cert_pin_content_url [http://www.gstatic.com/android/config_update/10142013-pins.txt]
  • 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 namespace

  • 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]
  • speak_password [0]
  • accessibility_script_injection_url [https://ssl.gstatic.com/accessibility/javascript/android/AndroidVox_v1.js]
  • 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 [disabled]
  • dropbox:data_app_wtf [disabled]
  • ssl_session_cache [file]
  • pubkey_blacklist [5f3ab33d55007054bc5e3e5553cd8d8465d77c61,783333c9687df63377efceddd82efa9101913e8e]
  • facelock_liveliness_recognition_threshold [2.2]
  • facelock_detection_threshold [0.0]
  • dropbox:data_app_crash [disabled]
  • 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 [ truncated base64 content ]
  • location_providers_allowed [gps,network]
  • allowed_geolocation_origins [http://www.google.co.uk http:// www.google.com]
  • locationPackagePrefixBlacklist []
  • user_setup_complete [1]
  • locationPackagePrefixWhitelist []
  • last_setup_shown [eclair_1]
16
dtyler

J'ai utilisé cette réponse pour masquer les touches programmables: https://stackoverflow.com/a/27003890/1525867

Et pour désactiver la StatusBar (cela pourrait endommager votre appareil, alors faites-le avec précaution. J'ai ruiné mon appareil plusieurs fois avant de le faire) Testé sur Asus Tinker Board, Android 6:

  • Téléchargez apktool à partir d'ici https://bitbucket.org/iBotPeaches/apktool/downloads/ et ajoutez-le à path de votre façon préférée
  • extraire SystemUI.apk de votre appareil: adb pull /system/priv-app/SystemUI/SystemUI.apk le chemin d'accès à SystemUI.apk peut être différent

  • extraire framework-res.apk de votre appareil adb pull /system/framework/framework-res.apk le chemin d'accès à framework-res.apk peut être différent

  • exécuter apktool if framework-res.apk

  • exécuter apktool if SystemUI.apk

  • exécuter apktool d SystemUI.apk

  • Ouvrez SystemUI\res\layout\status_bar.xml et ajoutez Android:visibility="gone" au dernier élément xml (pour moi, c'était com.Android.systemui.statusbar.phone.PhoneStatusBarView)

  • exécuter apktool b SystemUI

  • Allez à SystemUI\original et copiez AndroidManifest.xml et META-INF dans SystemUI\build\apk\

  • relancez apktool b SystemUI

  • Allez à SystemUI\dist\ et remplacez le SystemUI.apk d'origine du périphérique par celui qui est à SystemUI\dist\SystemUI.apk par adb Push SystemUI\dist\SystemUI.apk /system/priv-app/SystemUI/SystemUI.apk.

  • Redémarrer l'appareil

Basé sur ce fil de discussion https://forum.xda-developers.com/showthread.php?t=2203166

4
AvielNiego

Une excellente solution que j'ai trouvée pour ce problème, attribuant à chaque activité theme & windowSoftInputMode les valeurs suivantes:

<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 -->

pour plus d'informations référez-vous ici .

2
Muhammed Refaat

Je n'ai pas de solution parfaite mais une solution de contournement ici. L'idée de base est d'écouter les changements d'état du système et de forcer la navigation/la barre d'état comme étant invisibles. Son effet est similaire à celui défini pour le mode IMMERSIVE_STICKY mais la barre de navigation/statut disparaît plus rapidement que IMMERSIVE_STICKY.

c'est ici:

définir le style de l'interface utilisateur dans onCreate () et sur la fonction onResume, et définir le système d'écoute du changement d'écoute

    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);

force la barre système comme invisible dans onSystemUiVisibilityChange, définissant le système quelques secondes plus tard, sinon cela prend effet (ne sait pas exactement pourquoi, le système ignore simplement la demande de configuration du système lorsque la barre système n'a pas encore été complétée)

    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());


    }
}

alors vous pouvez configurer le système comme ceci:

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;
        }
    }
2
gonglong

ajoutez ceci avant: 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);
0
DiegoAlt