Buscar..


Superposición de ventanas emergentes

Para poder colocar su vista en la parte superior de cada aplicación, debe asignar su vista al gestor de ventanas correspondiente. Para eso necesita el permiso de alerta del sistema, que puede solicitarse agregando la siguiente línea a su archivo de manifiesto:

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

Nota: si su aplicación se destruye, su vista se eliminará del administrador de ventanas. Por lo tanto, es mejor crear la vista y asignarla al administrador de ventanas mediante un servicio en primer plano.

Asignando una vista al WindowManager

Puede recuperar una instancia del administrador de ventanas de la siguiente manera:

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

Para definir la posición de su vista, debe crear algunos parámetros de diseño de la siguiente manera:

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;

Ahora, puede asignar su vista junto con los parámetros de diseño creados a la instancia del administrador de ventanas de la siguiente manera:

mWindowManager.addView(yourView, mLayoutParams);

Voila! Su vista se ha colocado con éxito sobre todas las demás aplicaciones.

Nota: la vista no se colocará encima del protector del teclado.

Concesión del permiso SYSTEM_ALERT_WINDOW en Android 6.0 y superior

Desde Android 6.0 este permiso debe otorgarse dinámicamente,

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

Lanzar debajo del permiso denegado error en 6.0,

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

Solución: -

Solicitando permiso de superposición como a continuación,

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

Compruebe el resultado,

@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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow