Comment vérifier si “android.la permission.PACKAGE_USAGE_STATS” l'autorisation est donnée?
Fond
J'essaye de l'application lancée, en statistiques, et sur Lollipop, il est possible à l'aide de la UsageStatsManager de classe, en tant que tel (post original ici):
manifeste:
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions"/>
de l'ouverture de l'activité qui va permettre à l'utilisateur de confirmer en vous donnant cette autorisation:
startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
avoir les stats, agrégées :
private static final String USAGE_STATS_SERVICE ="usagestats"; //Context.USAGE_STATS_SERVICE);
...
final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService(USAGE_STATS_SERVICE);
final Map<String,UsageStats> queryUsageStats=usageStatsManager.queryAndAggregateUsageStats(fromTime,toTime);
Le problème
Je n'arrive pas à vérifier si l'autorisation que vous avez besoin ("android.la permission.PACKAGE_USAGE_STATS") est accordée. Tout ce que j'ai essayé jusqu'à présent renvoie toujours qu'il est refusé.
Le code fonctionne, mais la vérification d'autorisation ne fonctionne pas bien.
Ce que j'ai essayé
vous pouvez vérifier une autorisation accordée à l'aide de ceci:
String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getContext().checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
ou ceci:
String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getPackageManager().checkPermission(permission,getPackageName())== PackageManager.PERMISSION_GRANTED;
À la fois toujours retourné, il a refusé (même si j'ai l'autorisation en tant qu'utilisateur).
Regardant le code de UsageStatsManager, j'ai essayé de venir avec cette solution de contournement:
UsageStatsManager usm=(UsageStatsManager)getSystemService("usagestats");
Calendar calendar=Calendar.getInstance();
long toTime=calendar.getTimeInMillis();
calendar.add(Calendar.YEAR,-1);
long fromTime=calendar.getTimeInMillis();
final List<UsageStats> queryUsageStats=usm.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,fromTime,toTime);
boolean granted=queryUsageStats!=null&&queryUsageStats!=Collections.EMPTY_LIST;
Il a travaillé, mais c'est toujours une solution de contournement.
La question
Comment se fait je ne suis pas d'obtenir le résultat correct de la vérification d'autorisation?
Ce qui doit être fait pour vérifier il mieux?
- Double Possible de Vérifier si ma demande a l'utilisation de l'accès activé
- Il est assez vieux et trop tard pour cela, mais juste au cas où, parce que je vois ici, la réponse est plus mis à jour, j'ai ajouté ma réponse que j'utilise moi-même sur le lien : stackoverflow.com/a/54839499/878126
Vous devez vous connecter pour publier un commentaire.
Par notre enquête: si le MODE par défaut (MODE_DEFAULT), l'ajout de la vérification de l'autorisation est nécessaire. Grâce à Weien d'examen à l'effort.
Autorisations spéciales accordées par l'utilisateur dans les paramètres système (statistiques d'utilisation de l'accès, de la notification d'accès, ...) sont traitées par AppOpsManager, qui a été ajoutée dans Android 4.4.
Note que, outre l'utilisateur de vous accorder l'accès dans les paramètres système vous généralement besoin d'une autorisation dans le manifeste Android (ou certains de ses composants), sans que votre application ne s'affiche même pas dans les paramètres système. Pour les statistiques d'utilisation vous avez besoin
android.permission.PACKAGE_USAGE_STATS
autorisation.Il n'y a pas beaucoup de documentation à ce sujet, mais vous pouvez toujours vérifier Android sources pour cela.
La solution peut sembler très orthodoxe parce que certaines constantes ont été ajoutées plus tard à la
AppOpsManager
, et certaines constantes (par exemple, pour vérifier les différentes autorisations) sont encore cachés dans des Api privées.Cela vous indique si l'autorisation a été accordée par l'utilisateur.
A noter que depuis l'API de niveau 21, il est constant
AppOpsManager.OPSTR_GET_USAGE_STATS = "android:get_usage_stats"
.J'ai testé cette vérification de la Sucette (y compris 5.1.1) et il fonctionne comme prévu. Il me dit que l'utilisateur a donné l'autorisation explicite sans aucun plantage.
Il y a aussi la méthode
appOps.checkOp()
qui pourrait jeter unSecurityException
.checkOpNoThrow()
méthode, est ne devraient pas jeter de l'exception. Toutefois, la vérification ne semble pas être un travail sur Lollipop 🙁UsageStatsService
vous trouverez comment il vérifie l'autorisation. Il vérifie tout d'abord le consentement explicite de l'utilisateurAppOpsManager
et puis il issues de standard de vérification des autorisations. Il est important de savoir que ce contrôle vérifie uniquement utilisateur des autorisations de ce genre, elle ne vérifie pas manifeste des autorisations.Le deuxième argument de
checkOpNoThrow
estuid
, paspid
.Modifiant le code de réfléchir qui semble résoudre les problèmes d'autres ont été d'avoir:
Le supplément de vérifier dans Chris Li's réponse est inutile, sauf si vous êtes l'élaboration d'un système app.
Lorsqu'une application est installée et que l'utilisateur n'a pas touché l'application de l'utilisation de l'autorisation d'accès, puis
checkOpNoThrow()
retourneMODE_DEFAULT
.Chris dit ensuite, nous avons besoin de vérifier si l'application a la
PACKAGE_USAGE_STATS
manifeste de l'autorisation:Cependant, à moins que votre application est une application système, la vérification de cette autorisation retourne toujours
PERMISSION_DENIED
parce que c'est une signature de l'autorisation. De sorte que vous pouvez simplifier le code en bas à ceci:Que vous pouvez ensuite simplifier réduit à ceci:
Qui nous ramène à l'original, la solution la plus simple:
Testé et vérifié dans Android 5, 8.1 et 9.