[JAVA] Comment utiliser UsageStatsManager dans Android Studio (Comment vérifier l'heure de démarrage d'autres applications)

supposition

Windows 10 Dernière version d'Android Studio Java

** Cette méthode a bien fonctionné sur mon smartphone à partir du 27/02/2020. ** ** ** Il peut y avoir des changements dans les spécifications, donc si vous le copiez et collez et que cela ne fonctionne pas, veuillez vous référer au document officiel. ** **

Chose que tu veux faire

J'avais besoin de savoir combien d'autres applications fonctionnaient ce jour-là. Par exemple, l'image ci-dessous est une application appelée ActionDash, qui montre les heures de lancement d'autres applications.

En conclusion, vous pouvez utiliser UsageStatsManager.

UsageStatsManager

Relation d'autorité

Tout d'abord, écrivez-le dans ʻAndroidManifest.xml` comme indiqué ci-dessous.

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="****">

    <!--Ajout des deux lignes ci-dessous-->
    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions" />

    <application>
         <!--réduction-->
    </application>

</manifest>

Ensuite, effectuez une vérification des autorisations. Utilisez une méthode spéciale au lieu de la méthode d'autorisation habituelle.

private boolean checkReadStatsPermission() {
  //Obtenez AppOpsManager
  AppOpsManager aom = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
  // GET_USAGE_Obtenir le statut STATS
  int mode = aom.checkOp(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), getPackageName());
  if (mode == AppOpsManager.MODE_DEFAULT) {
    //Si l'état AppOps est la valeur par défaut, effectuez une vérification normale des autorisations.
    //Faux pour les applications ordinaires
    return checkPermission("android.permission.PACKAGE_USAGE_STATS", android.os.Process.myPid(), android.os.Process.myUid()) == PackageManager.PERMISSION_GRANTED;
  }
  //Uniquement autorisé est vrai si l'état AppOps n'est pas la valeur par défaut
  return mode == AppOpsManager.MODE_ALLOWED;
}

Enfin, il y a une demande d'autorisation. Veuillez noter que ceci est également différent de la méthode habituelle.

if (!checkReadStatsPermission()) {
  startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
}

Utiliser UsageStatsManager

L'explication est incluse dans le code source. Ce code source obtient le temps d'utilisation de l'application pour la journée.


public class UsageStatsClass {
  // Log.d()Et le nom pour l'identifier comme la sortie de cette classe
  private static final String TAG = UsageStatsClass.class.getSimpleName();
  //Contexte de substitution de MainActivity
  private Context context;

  public UsageStatsClass(Context mContext) {
    //Contexte de substitution
    context = mContext;
  }

  //Un objet appelé UsageStats est des informations pour une application.(Temps d'utilisation de l'application, etc.)Est inclus
  //Autrement dit, un UsageStats est attribué à chaque application.
  private List<UsageStats> getUsageStatsObject() {
    // getSystemService()Pour obtenir UsageStatsManager
    //UsageStatsManager est pour obtenir des informations d'utilisation de l'application
    UsageStatsManager usageStatsManager =
            (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);

    //Obtenir l'heure actuelle sous forme d'objet de calendrier
    Calendar calendar = Calendar.getInstance();
    //Réglez l'heure du calendrier sur minuit
    //En conséquence, les informations d'heure contenues dans le calendrier seront de l'heure actuelle à minuit d'aujourd'hui.
    calendar.set(Calendar.HOUR_OF_DAY, 0);

    // queryUsageStats(Unité de temps pour obtenir,Le début du temps pour obtenir, la fin du temps pour obtenir)
    //Unité de temps pour obtenir:du quotidien(INTERVAL_DAILY), Hebdomadaire(INTERVAL_WEEKLY), Mensuel(INTERVAL_MONTHLY)、
    //Annuel(INTERVAL_YEARLY), Sélection automatique(INTERVAL_BEST)Il y a
    // 
    //Le début du temps pour obtenir:Le point de départ du fuseau horaire des données que vous souhaitez acquérir. Cette fois, il est minuit.
    //Fin des temps pour obtenir:La fin du fuseau horaire des données que vous souhaitez obtenir. Cette fois, l'heure actuelle.
    return usageStatsManager.queryUsageStats(
            UsageStatsManager.INTERVAL_DAILY,
            calendar.getTimeInMillis(),
            System.currentTimeMillis());
  }

  //Fonction à exécuter de l'extérieur
  public void readOneDayUsageStats() {
    //Obtenir des informations sur l'utilisation de chaque application sous forme de liste
    List<UsageStats> usageStats = getUsageStatsObject();

    //Obtenir les informations d'utilisation d'une application dans usageStat à l'aide de l'instruction for
    for (UsageStats usageStat : usageStats) {
      //Si vous n'avez jamais utilisé l'application, ignorez-la
      if (usageStat.getTotalTimeInForeground() == 0) {
        continue;
      }

      //Sortie des informations acquises avec Logcat
      // package name : getPackageName() :ID unique à cette application
      // total time displayed : getTotalTimeInForeground() :Durée totale d'affichage de l'application à l'écran
      // first time : getFirstTimeStamp() :Renvoie l'heure de début des données acquises en millisecondes
      // getStringDate()Est utilisé pour convertir la milliseconde en une forme conviviale pour l'homme
      // end time : getLastTimeUsed() :Renvoie l'heure de fin des données récupérées en millisecondes
      // getStringDate()Est utilisé pour convertir la milliseconde en une forme conviviale pour l'homme
      Log.d(TAG, "packageName: " + usageStat.getPackageName() + "\ttotalTimeDisplayed: " + usageStat.getTotalTimeInForeground()
          + "\tfirstTime: " + getStringDate(usageStat.getFirstTimeStamp()) + "\tlastTime: " + getStringDate(usageStat.getLastTimeUsed()));
    }
  }

  //Convertir la milliseconde de type long en forme conviviale de type chaîne
  private String getStringDate(long milliseconds) {
    final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", Locale.JAPANESE);
    final Date date = new Date(milliseconds);
    return df.format(date);
  }
}

Résultat d'exécution

L'heure est affichée pour chaque application. Tu l'as fait!

D/UsageStatsClass: packageName: com.huawei.android.launcher	totalTimeDisplayed: 3769989	firstTime: 2020/02/27 00:00:02	lastTime: 2020/02/27 15:59:00
D/UsageStatsClass: packageName: jp.naver.line.android	totalTimeDisplayed: 805413	firstTime: 2020/02/27 00:00:02	lastTime: 2020/02/27 15:34:36
D/UsageStatsClass: packageName: com.discord	totalTimeDisplayed: 4247	firstTime: 2020/02/27 00:00:02	lastTime: 2020/02/27 15:43:05
D/UsageStatsClass: packageName: com.microsoft.office.outlook	totalTimeDisplayed: 43011	firstTime: 2020/02/27 00:00:02	lastTime: 2020/02/27 14:19:16
D/UsageStatsClass: packageName: com.google.android.packageinstaller	totalTimeDisplayed: 2444	firstTime: 2020/02/27 00:00:02	lastTime: 2020/02/27 15:59:02
D/UsageStatsClass: packageName: com.google.android.apps.photos	totalTimeDisplayed: 283917	firstTime: 2020/02/27 00:00:02	lastTime: 2020/02/27 13:38:33
D/UsageStatsClass: packageName: com.spotify.music	totalTimeDisplayed: 6267989	firstTime: 2020/02/27 00:00:02	lastTime: 2020/02/27 13:56:21
D/UsageStatsClass: packageName: jp.mineo.app.phone	totalTimeDisplayed: 70175	firstTime: 2020/02/27 00:00:02	lastTime: 2020/02/27 13:59:50
D/UsageStatsClass: packageName: com.google.android.apps.translate	totalTimeDisplayed: 8170	firstTime: 2020/02/27 00:00:02	lastTime: 2020/02/27 15:04:14
D/UsageStatsClass: packageName: ch.bitspin.timely	totalTimeDisplayed: 798142	firstTime: 2020/02/27 00:00:02	lastTime: 2020/02/27 11:17:25
D/UsageStatsClass: packageName: com.android.settings	totalTimeDisplayed: 21715	firstTime: 2020/02/27 00:00:02	lastTime: 2020/02/27 14:32:32

Les références

Recommended Posts

Comment utiliser UsageStatsManager dans Android Studio (Comment vérifier l'heure de démarrage d'autres applications)
Comment utiliser ExpandableListView dans Android Studio
Développement Android, comment vérifier null dans la valeur de l'objet JSON
Comment vérifier le journal dans le conteneur Docker
3 façons d'importer des bibliothèques dans Android Studio
Utilisez le JDK utilisé dans Android Studio dans le terminal
Sortie de la façon d'utiliser la méthode slice
Comment utiliser JQuery dans Rails 6 js.erb
Comment vérifier les commandes Rails dans le terminal
Comment vérifier la dernière version de io.spring.platform pour l'écriture dans pom.xml de Spring (STS)
Comment régler l'heure d'affichage sur l'heure japonaise dans les rails
[Android Studio] [Java] Comment réparer l'écran verticalement
Comment utiliser CommandLineRunner dans Spring Batch of Spring Boot
[Android] Comment obtenir la langue de réglage du terminal
Comment utiliser git avec la puissance de jgit dans un environnement sans commandes git
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
Comment utiliser la méthode getter / setter (en orientation objet)
Comment faire une capture d'écran avec l'émulateur Android Studio
Comment régler chrony lorsque le temps change dans CentOS7
Reportez-vous à C ++ dans le module Android Studio (Java / kotlin)
Comment créer une partie d'espace réservé à utiliser dans la clause IN
Comment obtenir des valeurs en temps réel avec TextWatcher (Android)
Comment implémenter l'affichage sur une seule ligne de TextView dans le développement Android
Comment dériver le dernier jour du mois en Java
Comment vérifier l'extension et la taille des fichiers téléchargés
Comment utiliser la méthode link_to
Comment utiliser Lombok au printemps
Comment utiliser la méthode include?
[Sprint Boot] Comment utiliser les trois types de SqlParameterSource définis dans org.springframework.jdbc.core.namedparam
Comment utiliser la classe wrapper
Comment utiliser setDefaultCloseOperation () de JFrame
Comment utiliser InjectorHolder dans OpenAM
Comment obtenir l'identifiant de la clé PRIMAY incrémentée automatiquement dans MyBatis
Comment utiliser les classes en Java?
Emplacement de la définition de la méthode Résumé de la vérification Lorsque défini dans le projet et Rails / Gem
Comment vérifier le contenu de la chaîne de caractères java de longueur fixe
Comment obtenir la longueur d'un fichier audio avec Java
Comment incrémenter la valeur de Map sur une ligne en Java
[Android] Développer un service permettant aux étudiants universitaires de vérifier l'état de fonctionnement des bus circulant dans l'université.
Comment créer un retrait de deux espaces d'un octet dans l'implémentation JAXB du JDK
L'histoire de la sortie de l'application Android sur le Play Store pour la première fois.
Qu'est-ce qui n'était pas une utilisation équitable du détournement d'API Java sur Android?
Comment modifier le nombre maximum et maximum de données POST dans Spark
Comment trouver le nombre total de pages lors de la pagination en Java
Comment contraindre l'action de la destination de transition lorsqu'elle n'est pas connectée
Comment changer la valeur d'une variable à un point d'arrêt dans intelliJ
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
Est-il possible de mettre la bibliothèque (aar) dans la bibliothèque Android (aar) et de l'utiliser?
Comment mettre en œuvre la fonction d'authentification du courrier au moment de l'inscription de l'utilisateur
[Rails] Comment résoudre le décalage temporel de created_at après la méthode de sauvegarde
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
[Java] Comment utiliser la classe File
Comment utiliser le volume nommé dans docker-compose.yml
Utilisez ViewModel pour faire pivoter approximativement les applications Android