web-dev-qa-db-fra.com

SYSTEM_ALERT_WINDOW - Comment obtenir cette permission automatiquement sur Android 6.0 et targetSdkVersion 23

Facebook, Evernote, Pocket - toutes les applications obtiennent cette autorisation automatiquement sur Android 6.0, même si elles ciblent 23 (targetSdkVersion=23).

Il y a eu beaucoup de documentation concernant le nouveau modèle d'autorisation de Marshmallow. L'un d'eux est SYSTEM_ALERT_WINDOW été 'promu' vers la classe d'autorisations 'supérieure à dangereuse', ce qui nécessite une intervention spéciale de l'utilisateur pour que les applications en bénéficient. Si l'application a targetSdkVersion 22 ou moins, l'application obtient cette autorisation automatiquement (si demandé dans le manifeste).

Cependant, j'ai remarqué que certaines applications obtiennent cette autorisation, sans avoir à envoyer l'utilisateur à la page de configuration spéciale de l'autorisation Draw over other apps. J'ai vu Facebook, Evernote, Pocket - et il y en a peut-être d'autres.

Tout le monde sait comment une autorisation peut être accordée à une application sans que l'utilisateur ne passe par Settings -> Apps -> Draw over other apps?

Merci

71
oriharel

C'est un nouveau comportement introduit dans Marshmallow 6.0.1 .

Chaque application qui demande l'autorisation SYSTEM_ALERT_WINDOW et qui est installée via le Play Store (la version 6.0.5 ou une version ultérieure est requise) devra: accordé la permission automatiquement.

Si, au lieu de cela, l'application est chargée latéralement, l'autorisation n'est pas automatiquement accordée. Vous pouvez essayer de télécharger et d’installer Evernote APK à partir de apkmirror.com . Comme vous pouvez le constater, vous devez accorder manuellement l’autorisation dans Settings -> Apps -> Draw over other apps.

Ce sont les commits [1][2] qui permettent au Play Store d’accorder l’octroi automatique de l’autorisation SYSTEM_ALERT_WINDOW.

99
Mattia Maestrini

Yeh After Marshmallow arrive Android améliore le niveau de sécurité, mais pour

SYSTEM_ALERT_WINDOW

vous pouvez afficher une action flottante et tout ce que vous voulez Vous pouvez obliger l'utilisateur à donner l'autorisation. En suivant les codes dans votre méthode onCreate() Mettez ce code après setContentView

    // Check if Android M or higher
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        // Show alert dialog to the user saying a separate permission is needed
        // Launch the settings activity if the user prefers
        Intent myIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
        startActivity(myIntent);
    }

L'action ACTION_MANAGE_OVERLAY_PERMISSION lance directement l'écran d'autorisation "Dessiner sur d'autres applications".


Edit: Mon code ci-dessus fonctionne à 100% correct

Mais je viens de trouver que beaucoup de gars sont toujours à la recherche de ce qui peut permettre ACTION_MANAGE_OVERLAY_PERMISSIONde façon permanente, comme si l'utilisateur autorisait Permission Once, alors ne le demandez pas à chaque fois qu'il ouvre l'application alors entendez la solution pour vous -

  1. Vérifier si l'appareil a l'API 23+

  2. si 23+ API puis vérifier si l'utilisateur a permis ou non

  3. si une fois le permis obtenu ne le conduit pas à Settings.ACTION_MANAGE_OVERLAY_PERMISSION et s'il ne l'a pas encore permis, demandez une vérification des autorisations d'exécution.

Mettez sous la ligne dans votre méthode onCreate(). Mettez ceci après setContentView

checkPermission();

Maintenant, mettez le code ci-dessous dans onActivityResult

@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
        if (!Settings.canDrawOverlays(this)) {
            // You don't have permission
            checkPermission();
        } else {
            // Do as per your logic 
        }

    }

}

Maintenant enfin le code de la méthode checkPermission

public void checkPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
        }
    }
}

Et n'oubliez pas de déclarer cette variable publique dans votre classe

public static int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 5469;
56
Jayman Jani

Si l'application cible 22 ou moins l'API, Play Store donnera l'autorisation SYSTEM_ALERT_WINDOW et d'autres lorsque l'utilisateur clique pour installer (afficher une alerte) même si son appareil est Android 6.0. Sinon, si l'application cible l'API 23 ou supérieur, de sorte que l'autorisation sera demandée dans le temps d'exécution.

2
Dennix

Maintenant (2019), Google propose une API alternative à SYSTEM_ALERT_WINDOW sous la forme de Bubbles dans Android Q, Google a finalement décidé de deprecate SYSTEM_ALERT_WINDOW dans une future version de Android.

Et Android Go appareils n'accordera plus cette autorisation i.e Settings.canDrawOverlays() == false

2
Dickson