Recherche…


Afin de placer votre vue au-dessus de chaque application, vous devez attribuer votre vue au gestionnaire de fenêtres correspondant. Pour cela, vous devez disposer de l'autorisation d'alerte système, qui peut être demandée en ajoutant la ligne suivante à votre fichier manifeste:

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

Remarque: Si votre application est détruite, votre vue sera supprimée du gestionnaire de fenêtres. Par conséquent, il est préférable de créer la vue et de l'affecter au gestionnaire de fenêtres par un service de premier plan.

Affectation d'une vue au WindowManager

Vous pouvez récupérer une instance du gestionnaire de fenêtres comme suit:

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

Pour définir la position de votre vue, vous devez créer des paramètres de disposition comme suit:

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;

Vous pouvez maintenant affecter votre vue avec les paramètres de mise en page créés à l'instance du gestionnaire de fenêtres comme suit:

mWindowManager.addView(yourView, mLayoutParams);

Voila! Votre vue a été placée avec succès sur toutes les autres applications.

Note: Votre vue ne sera pas placée sur le protège-clavier.

Accorder la permission SYSTEM_ALERT_WINDOW sur Android 6.0 et supérieur

Depuis Android 6.0, cette autorisation doit accorder dynamiquement,

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

Lancer l'autorisation ci-dessous a refusé l'erreur sur 6.0,

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

Solution :-

Demander l'autorisation de superposition comme ci-dessous,

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

Vérifier le résultat,

@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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow