J'ai l'application MDM pour les parents de contrôler les appareils de l'enfant et il utilise la permission SYSTEM_ALERT_WINDOW
pour afficher des avertissements sur l'appareil de l'enfant lorsque l'action interdite effectuée. Sur les appareils M + lors de l'installation de l'application vérifie l'autorisation d'utiliser cette méthode:Pourquoi dans la méthode Android O Settings.canDrawOverlays() renvoie "false" lorsque l'utilisateur a accordé l'autorisation de dessiner des superpositions et retourne à mon application?
Settings.canDrawOverlays(getApplicationContext())
et si ce retour de la méthode false
l'application ouvre le dialogue du système où l'utilisateur peut accorder l'autorisation:
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
Dans Android O, lorsque l'utilisateur accorde avec succès l'autorisation et revient à l'application en appuyant sur le bouton précédent, la méthode canDrawOverlays()
toujours retourner false
, jusqu'à ce que l'utilisateur ne ferme pas l'application et l'ouvrir à nouveau ou simplement le choisir dans les récentes applications. Je l'ai testé sur la dernière version de l'appareil virtuel avec Android O dans Android Studio parce que je n'ai pas de véritable appareil.
J'ai fait un peu de recherche et, en outre vérifier l'autorisation avec AppOpsManager:
AppOpsManager appOpsMgr = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), getPackageName());
Log.d(TAG, "android:system_alert_window: mode=" + mode);
Et:
- lorsque l'application ne dispose pas de cette autorisation, le mode est "2" (MODE_ERRORED) (
canDrawOverlays()
renvoiefalse
) lorsque l'utilisateur - a accordé la permission et est revenu à l'application, le mode est "1" (MO DE_IGNORED) (
canDrawOverlays()
retoursfalse
) - et si vous ouvrez à nouveau maintenant l'application, le mode est "0" (MODE_ALLOWED) (
canDrawOverlays()
retourstrue
)
S'il vous plaît, quelqu'un peut-il expliquer ce comportement à moi? Puis-je compter sur mode == 1
de l'opération "android:system_alert_window"
et supposer que l'utilisateur a accordé la permission?
Ils ont réagi très rapidement, très bien. C'est la première fois que je rencontre un bug non corrigé dans Android. Je pense que la question est fermée et marquez votre poste comme une réponse. – fishbone
Pouvez-vous s'il vous plaît partager le code complet pour vérifier si l'application est accordée avec cette autorisation? –