Ricerca…


Sovrapposizione popup

Per mettere la tua vista sopra ogni applicazione, devi assegnare la tua vista al gestore di finestre corrispondente. Per questo è necessaria l'autorizzazione di avviso di sistema, che può essere richiesta aggiungendo la seguente riga al file manifest:

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

Nota: se l'applicazione viene distrutta, la visualizzazione verrà rimossa dal gestore di finestre. Pertanto, è preferibile creare la vista e assegnarla al gestore di finestre tramite un servizio in primo piano.

Assegnazione di una vista a WindowManager

È possibile recuperare un'istanza del gestore di finestre come segue:

WindowManager mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);

Per definire la posizione della tua vista, devi creare alcuni parametri di layout come segue:

WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.TYPE_PHONE,
        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
        PixelFormat.TRANSLUCENT);
mLayoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;

Ora è possibile assegnare la vista insieme ai parametri di layout creati all'istanza del gestore finestre come segue:

mWindowManager.addView(yourView, mLayoutParams);

Ecco! La tua vista è stata posizionata con successo in cima a tutte le altre applicazioni.

Nota: la vista non verrà posizionata sopra il blocco tasti.

Concessione dell'autorizzazione SYSTEM_ALERT_WINDOW su Android 6.0 e versioni successive

Da Android 6.0 questa autorizzazione deve essere concessa in modo dinamico,

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

Gettare sotto l'autorizzazione ha negato l'errore su 6.0,

Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@86fb55b -- permission denied for this window type

Soluzione: -

Richiesta di permesso Overlay come di seguito,

if(!Settings.canDrawOverlays(this)){
    // ask for setting 
     Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
     Uri.parse("package:" + getPackageName()));
     startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION);
}

Controlla il risultato,

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_OVERLAY_PERMISSION) {
        if (Settings.canDrawOverlays(this)) {
            // permission granted...
        }else{
            // permission not granted...
        }
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow