web-dev-qa-db-fra.com

Comment utiliser UsageStatsManager?

Contexte

Google a déconseillé d'utiliser la fonction " getRecentTasks " de la classe "ActivityManager". Il ne vous reste plus qu'à obtenir la liste des applications ouvertes par l'application actuelle.

J'ai même écrit un article à ce sujet ici sur StackOverflow , mais j'ai remarqué que c'était impossible.

Le problème

J'ai posté un article à ce sujet ( here et un autre similaire créé par quelqu'un d'autre, here ) et j'ai demandé à le réexaminer, puis Google a décidé pour créer une nouvelle classe, qui semble fournir une fonctionnalité similaire (plutôt comme des statistiques, mais pourrait aussi être utile), mais je ne parviens pas à savoir comment l’utiliser.

La classe s'appelle "UsageStatsManager" et je suppose que la fonction " queryUsageStats " fait le travail.

De plus, il semble qu'il ait une nouvelle permission ("Android.permission.PACKAGE_USAGE_STATS"), qui est une permission système, mais il est écrit que

la déclaration de l'autorisation implique l'intention d'utiliser l'API et l'utilisateur de l'appareil peut accorder une autorisation via l'application Paramètres.

Voici un autre lien sur cette nouvelle fonctionnalité.

Ce que j'ai trouvé

J'ai examiné le code d'Android et remarqué que "Context" contient USAGE_STATS_SERVICE, ce qui, dans les JavaDocs, indique ce qui suit:

/**
 * Use with {@link #getSystemService} to retrieve a {@link
 * Android.app.UsageStatsManager} for interacting with the status bar.
 *
 * @see #getSystemService
 * @see Android.app.UsageStatsManager
 * @hide
 */
public static final String USAGE_STATS_SERVICE = "usagestats";

La chose étrange est que non seulement il est écrit "status bar", mais aussi le packageName ne correspond pas (devrait être "Android.app.usage.UsageStatsManager" à la place).

J'ai aussi ajouté la permission correcte:

<uses-permission
    Android:name="Android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />

et voici le code que j'utilise:

  final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService("usagestats");// Context.USAGE_STATS_SERVICE);
  final int currentYear=Calendar.getInstance().get(Calendar.YEAR);
  final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear);

Dans l'émulateur lui-même, je suis allé à "Settings"->"security"->"apps with usage access" et j'ai activé mon application.

Cependant, lors de l'exécution du code, tout ce que je reçois est une liste vide ...

La question

Comment utilisez-vous UsageStatsManager

Aussi, comment laissez-vous l'utilisateur accorder l'autorisation le plus facilement possible? Ou est-ce fait automatiquement, dès que l'application essaie d'obtenir les informations nécessaires?

Que se passe-t-il lorsque vous essayez d'utiliser cette classe alors que l'utilisateur ne l'a pas encore confirmée?

Comment puis-je faire en sorte que le code me renvoie une vraie liste d'applications?

48
android developer

Je pense que la documentation était juste courte pour le calendrier. Je ne pense pas que cela fonctionne réellement avec seulement 2014; Cependant, je peux me tromper. 

Pour accéder à la liste actuelle de UsageStats, vous devez créer un objet Calendar avec le mois, le jour et l'année corrects. Exactement comment MRK a dit dans l'autre réponse. J'ai copié et corrigé les erreurs dans le code de MRK afin que quiconque le voyant à l'avenir puisse le voir.

Calendar beginCal = Calendar.getInstance();
beginCal.set(Calendar.DATE, 1);
beginCal.set(Calendar.MONTH, 0);
beginCal.set(Calendar.YEAR, 2012);

Calendar endCal = Calendar.getInstance();
endCal.set(Calendar.DATE, 1);
endCal.set(Calendar.MONTH, 0);
endCal.set(Calendar.YEAR, 2014);

final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginCal.getTimeInMillis(), endCal.getTimeInMillis());

-Crédit MRK; corrigé par moi (il a accidentellement mis cal au lieu de beginCal et endCal)

Le code pour les paramètres d'accès à l'utilisation est ci-dessous. :)

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);
28
Atish

J'ai créé un exemple d'utilisation de UsageStats sur mon Github .. J'espère que cela pourra aider quelqu'un

https://github.com/ColeMurray/UsageStatsSample

21
Cole Murray

Répondant à votre dernière question "Comment puis-je faire en sorte que le code me renvoie une vraie liste d'applications?". queryUsageStats prend l'heure de début et l'heure de fin en millisecondes, pas la valeur de l'année en int.

Calendar beginCal = Calendar.getInstance();
beginCal.set(Calendar.DATE, 1);
beginCal.set(Calendar.MONTH, 0);
beginCal.set(Calendar.YEAR, 2012);

Calendar endCal = Calendar.getInstance();
endCal.set(Calendar.DATE, 1);
endCal.set(Calendar.MONTH, 0);
endCal.set(Calendar.YEAR, 2014);

final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginCal.getTimeInMillis(), endCal.getTimeInMillis());

Cela devrait renvoyer une liste de statistiques d'utilisation pour les années 2012 et 2013 (n'oubliez pas que l'heure de fin exclut la plage de temps du résultat final).

8
MRK

Utiliser UsageStats obtiendra des informations erronées lorsque l'utilisateur ouvrira le tiroir de notification ou sur un écran verrouillé. Vous devez utiliser UsageStatsManager.queryEvents () et rechercher le dernier événement avec le type d'événement MOVE_TO_FOREGROUND.

3
Sam Lu

Si vous voulez voir les statistiques d'utilisation d'une période spécifique. Vous devez d’abord calculer la durée en millisecondes du début et de la fin de votre période, depuis l’époque. (Epoch correspond au nombre de secondes écoulées depuis 00:00:00 UTC le jeudi 1 juillet 1970.) Ou, comme je le montrerai dans l'exemple de code suivant, une méthode simple consiste à calculer le temps, en millisecondes, en arrière.

Par exemple, si vous voulez une statistique des 4 derniers jours, ce serait:

UsageStatsManager mUsageStatsManager = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE);    
List<UsageStats> queryUsageStats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,
                    (System.currentTimeMillis() - 345600000), System.currentTimeMillis());

Le nombre 345600000 est la quantité de millisecondes de 4 jours. 

Et pour INTERVAL_TYPE ceci explique-le bien. 

Le système collecte et agrège les données sur 4 intervalles différents et ils sont: INTERVAL_DAILY, INTERVAL_WEEKLY, INTERVAL_MONTHLY et INTERVAL_YEARLY. Les enregistrements système sont limités dans le temps, vous serez donc capable de récupérer les données d'utilisation de l'application pendant 7 jours au maximum, par intervalle quotidien, jusqu'à 4 semaines pour l'intervalle hebdomadaire, jusqu'à 6 mois pour le mois et le enfin jusqu'à 2 ans par an. Il existe une cinquième option à mentionner: INTERVAL_BEST choisira le meilleur intervalle d'ajustement entre les quatre ci-dessus en fonction de la période que vous avez choisie.

0
Msgun

tu peux faire comme ça

//noinspection ResourceType
final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService("usagestats");// Context.USAGE_STATS_SERVICE);
final int currentYear=Calendar.getInstance().get(Calendar.YEAR);
final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear);
0