Overlay Barra di stato su android 4.2.2+

Voglio sovrapporre la barra di stato android. Nel mio caso è in cima. Non voglio sovrapporre o hide la barra di navigazione.

Nota : la soluzione deve funzionare su android 4.2.2+. Preferisco le risposte per un dispositivo non radicato.

  • Android: Multi touch e TYPE_SYSTEM_OVERLAY
  • Come formattare un numero di telefono utilizzando PhoneNumberUtils?
  • Inserimento duplicato utilizzando Parse e Multidex
  • Ridimensionare TextView non riduce la sua altezza su Android 3.1
  • Come aggiungere parametri a una richiesta GET HTTP in Android?
  • Recupera il text da. txt in una visualizzazione di un elemento di listview
  • Ho cercato molte domande e risposte SO, ma nessuno funziona in 4.2.2.

    Di seguito è il mio codice, ma non consuma events di touch. Ecco perché la barra di stato apre il suo pannello. E non voglio questo.

    @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); int statusBarHeight = (int) Math.ceil(25 * getResources().getDisplayMetrics().density); overlay = new Button(this); overlay.setBackgroundColor(Color.GREEN); overlay.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.i("StatusBar", "touched"); return false; } }); WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.FILL_PARENT, statusBarHeight, WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); params.gravity = Gravity.TOP | Gravity.RIGHT; windowManager.addView(overlay, params); } @Override public void onDestroy() { super.onDestroy(); if (overlay != null) windowManager.removeView(overlay); } 

    Nell'attività principale inizio servizio:

     startService(new Intent(this, StatusBarService.class)); 

    E l'authorization viene aggiunta in AndroidManifest.xml:

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

    E ora prova può essere fatto e funziona in 4.2.2: Gioca a Google – MobiLock

    Come?

    Screenshots: immettere qui la descrizione dell'immagineimmettere qui la descrizione dell'immagine

  • Numerazione dell'image salvata dalla risorsa app per la scheda SD
  • Come leggere le properties; Android con Java
  • Calcola la differenza di tempo in Android
  • Effettuare una chiamata su numero seguito dal tasto #
  • Android Dev - URL di richiamata non funzionante ... (0_o)
  • Cambiare il colore della barra progressiva tramite CODICE SOLO in Android
  • 3 Solutions collect form web for “Overlay Barra di stato su android 4.2.2+”

    Dopo provare e ripetere, questo mi ha fatto:

     int statusBarHeight = (int) Math.ceil(25 * getResources().getDisplayMetrics().density); WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.FILL_PARENT, statusBarHeight, WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); 

    Funziona su 4.2.2 e 4.4.2

    Non potevamo impedire che lo stato venisse visualizzato in modalità a schermo integer in dispositivi di kitkat, pertanto ha fatto un hack che ancora soddisfa l'esigenza, ovvero bloccare la barra di stato dall'espansione.

    Per far funzionare, l'applicazione non è stata eseguita a schermo integer. Abbiamo messo un overlay sulla barra di stato e consumato tutti gli events di input. Ha impedito allo stato di espandersi.

    Nota:

    • customViewGroup è class personalizzata che estende qualsiasi layout (frame, layout relativo ecc.) e consuma l'evento di contatto.
    • per consumare l'evento di contatto ignora il metodo onInterceptTouchEvent del gruppo di visualizzazione e restituisce true

    aggiornato

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

    implementazione customViewGroup Codice:

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

    Nota non necessaria di rooting

    Non puoi mettere la tua applicazione in un tema di notitlebar [non rimuovere la barra di navigazione] e implementare la tua vista in cima che imita l'aspetto della barra di notifica come contenitore e il resto del contenuto sarà frammenti?

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.