Android
Creazione di finestre sovrapposte (sempre in primo piano)
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...
}
}
}