Disabilitare la visualizzazione della statusbar in una app Android

Tags: 

Premessa: Android 3 per tablet mostra una statusbar (o "bottombar") contenente i tasti di sistema (a differenza delle versioni precedenti dove quella barra era "hardware"). Questa barra non può essere eliminata con comandi "normali".

Non ha tutti i torti Google a imporre questa limitazione: in caso contrario sarebbe possibile per dei malware cammuffare una propria barra da barra di sistema. Essendo tale barra vitale per Android, ciò è male.

Nonostante questo potrebbe essere necessario per applicazioni particolari nasconderla comunque.

L'unica cosa che si può fare tramite API è nasconderla parzialmente.

  • E' possibile infatti usare il comando View.setSystemUiVisibility(View.STATUS_BAR_HIDDEN) per renderla completamente nera (è comunque presente), sostituendo i pulsanti con dei "pallini" poco visibili. Un metodo introdotto principalmente per i player di video, per permettere una visualizzazione full-screen non infastidita dalla barra.
  • Ad esempio è possibile, nell'onCreate dell'Activity, chiamare il comando sopra su una qualunque delle view.
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      findViewById(R.id.button0).setSystemUiVisibility(View.STATUS_BAR_HIDDEN);
    }

    E' possibile eliminare completamente la barra solo se nel dispositivo si hanno privilegi di ROOT.

    Come root è possibile terminare dei servizi, e la barra in basso è gestita dal servizio di sistema "SystemUI". Quindi, chiudendo quel servizio si toglie la barra.

    Si può testare il sistema anche manualmente via interfaccia, andando in gestione processi e terminando il processo in oggetto.

    Quindi, per via programmatica, "basta" terminare il servizio quando si vuole nascondere la barra, e riavviarlo quando si vuole mostrare o quando si esce dall'app (altrimenti poi la barra non c'e' più neanche fuori e ci tocca resettare il dispositivo!).

    Ecco come fare:

        boolean rootMode = true;
        public void disableBottombar() {
            if (rootMode) {
                Process proc;
                try {
                    proc = Runtime.getRuntime().exec(new String[]{"su","-c","service call activity 79 s16 com.android.systemui"});
                    proc.waitFor();
                } catch (IOException e) {
                    log("FAILED disableBottome" + e.getMessage());
                } catch (InterruptedException e) {
                    log("FAILED disableBottome" + e.getMessage());
                }
            }
        }
        
        public void enableBottombar() {
            if (rootMode) {
                Process proc;
                try {
                    proc = Runtime.getRuntime().exec(new String[]{"am","startservice","-n","com.android.systemui/.SystemUIService"});
                    proc.waitFor();
                } catch (IOException e) {
                    log("FAILED disableBottome" + e.getMessage());
                } catch (InterruptedException e) {
                    log("FAILED disableBottome" + e.getMessage());
                }
            }
        }

    Nel codice basta chiamare "enableBottombar()" per visualizzarla, "disableBottombar()" per toglierla.

    Per disabilitarla all'avvio dell'applicazione, e riabilitarla ogni volta che l'app viene messa in background, fare cosi':

        @Override
        protected void onResume() {
            super.onResume();
            disableBottombar();
        }
     
        @Override
        protected void onPause() {
            enableBottombar();
            super.onPause();
        }
     
        @Override
        protected void onDestroy() {
            enableBottombar();
        }

    Aggiungi un commento