[JAVA] Verwendung von UsageStatsManager in Android Studio (Überprüfen der Startzeit anderer Apps)

Annahme

Windows 10 Android Studio neueste Version Java

** Diese Methode hat auf meinem Smartphone ab dem 27.02.2020 einwandfrei funktioniert. ** ** ** ** Die Spezifikationen können sich ändern. Wenn Sie sie also kopieren und einfügen und sie nicht funktioniert, lesen Sie bitte das offizielle Dokument. ** ** **

Was du machen willst

Ich musste herausfinden, wie viele andere Apps an diesem Tag ausgeführt wurden. Das folgende Bild ist beispielsweise eine App namens ActionDash, die die Startzeiten anderer Apps anzeigt.

Abschließend können Sie UsageStatsManager verwenden.

UsageStatsManager

Autoritätsbeziehung

Schreiben Sie es zuerst in "AndroidManifest.xml", wie unten gezeigt.

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="****">

    <!--Die beiden folgenden Zeilen wurden hinzugefügt-->
    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions" />

    <application>
         <!--Kürzung-->
    </application>

</manifest>

Führen Sie als Nächstes eine Berechtigungsprüfung durch. Verwenden Sie anstelle der üblichen Berechtigungsmethode eine spezielle Methode.

private boolean checkReadStatsPermission() {
  //Holen Sie sich AppOpsManager
  AppOpsManager aom = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
  // GET_USAGE_Erhalten Sie den STATS-Status
  int mode = aom.checkOp(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), getPackageName());
  if (mode == AppOpsManager.MODE_DEFAULT) {
    //Wenn der AppOps-Status der Standardstatus ist, führen Sie eine normale Berechtigungsprüfung durch.
    //Falsch für normale Apps
    return checkPermission("android.permission.PACKAGE_USAGE_STATS", android.os.Process.myPid(), android.os.Process.myUid()) == PackageManager.PERMISSION_GRANTED;
  }
  //Nur erlaubt ist wahr, wenn der AppOps-Status nicht der Standard ist
  return mode == AppOpsManager.MODE_ALLOWED;
}

Schließlich gibt es eine Bitte um Erlaubnis. Bitte beachten Sie, dass sich dies auch von der üblichen Methode unterscheidet.

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

Verwenden Sie UsageStatsManager

Die Erklärung ist im Quellcode enthalten. Dieser Quellcode gibt die App-Nutzungszeit für den Tag an.


public class UsageStatsClass {
  // Log.d()Und der Name, um es als Ausgabe dieser Klasse zu identifizieren
  private static final String TAG = UsageStatsClass.class.getSimpleName();
  //Ersatzkontext von MainActivity
  private Context context;

  public UsageStatsClass(Context mContext) {
    //Ersatzkontext
    context = mContext;
  }

  //Ein Objekt namens UsageStats ist eine Information für eine App.(Nutzungszeit der App usw.)Ist enthalten
  //Das heißt, jeder App wird eine UsageStats zugewiesen.
  private List<UsageStats> getUsageStatsObject() {
    // getSystemService()So rufen Sie UsageStatsManager ab
    //UsageStatsManager dient zum Abrufen von Nutzungsinformationen der Anwendung
    UsageStatsManager usageStatsManager =
            (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);

    //Ruft die aktuelle Uhrzeit als Kalenderobjekt ab
    Calendar calendar = Calendar.getInstance();
    //Stellen Sie die Kalenderzeit auf Mitternacht ein
    //Infolgedessen sind die im Kalender enthaltenen Zeitinformationen von der aktuellen Zeit bis zur heutigen Mitternacht.
    calendar.set(Calendar.HOUR_OF_DAY, 0);

    // queryUsageStats(Zeiteinheit zu bekommen,Der Anfang der Zeit zu bekommen, das Ende der Zeit zu bekommen)
    //Zeiteinheit zu bekommen:Täglich(INTERVAL_DAILY), Wöchentlich(INTERVAL_WEEKLY)Monatlich(INTERVAL_MONTHLY)、
    //Jährlich(INTERVAL_YEARLY), Automatische Auswahl(INTERVAL_BEST)Es gibt
    // 
    //Der Beginn der Zeit zu bekommen:Der Startpunkt der Zeitzone der Daten, die Sie erfassen möchten. Diesmal ist Mitternacht des Tages.
    //Ende der Zeit zu bekommen:Das Ende der Zeitzone der Daten, die Sie abrufen möchten. Diesmal die aktuelle Zeit.
    return usageStatsManager.queryUsageStats(
            UsageStatsManager.INTERVAL_DAILY,
            calendar.getTimeInMillis(),
            System.currentTimeMillis());
  }

  //Funktion zur Ausführung von außen
  public void readOneDayUsageStats() {
    //Erhalten Sie Nutzungsinformationen für jede App als Liste
    List<UsageStats> usageStats = getUsageStatsObject();

    //Rufen Sie mithilfe der for-Anweisung Nutzungsinformationen einer App in usageStat ab
    for (UsageStats usageStat : usageStats) {
      //Wenn Sie die App noch nie verwendet haben, überspringen Sie sie
      if (usageStat.getTotalTimeInForeground() == 0) {
        continue;
      }

      //Geben Sie die erfassten Informationen mit Logcat aus
      // package name : getPackageName() :ID eindeutig für diese App
      // total time displayed : getTotalTimeInForeground() :Gesamtzeit, in der die App auf dem Bildschirm angezeigt wurde
      // first time : getFirstTimeStamp() :Gibt die Startzeit der erfassten Daten in Millisekunden zurück
      // getStringDate()Wird verwendet, um Millisekunden in eine menschenfreundliche Form umzuwandeln
      // end time : getLastTimeUsed() :Gibt die Endzeit der abgerufenen Daten in Millisekunden zurück
      // getStringDate()Wird verwendet, um Millisekunden in eine menschenfreundliche Form umzuwandeln
      Log.d(TAG, "packageName: " + usageStat.getPackageName() + "\ttotalTimeDisplayed: " + usageStat.getTotalTimeInForeground()
          + "\tfirstTime: " + getStringDate(usageStat.getFirstTimeStamp()) + "\tlastTime: " + getStringDate(usageStat.getLastTimeUsed()));
    }
  }

  //Konvertieren Sie eine Millisekunde vom Typ Lang in eine benutzerfreundliche Form vom Typ String
  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);
  }
}

Ausführungsergebnis

Die Uhrzeit wird für jede App angezeigt. Du hast es geschafft!

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

Verweise

Recommended Posts

Verwendung von UsageStatsManager in Android Studio (Überprüfen der Startzeit anderer Apps)
Verwendung von ExpandableListView in Android Studio
Android-Entwicklung, wie man den Wert des JSON-Objekts auf null überprüft
So überprüfen Sie das Protokoll im Docker-Container
3 Möglichkeiten zum Importieren von Bibliotheken in Android Studio
Verwenden Sie das in Android Studio verwendete JDK im Terminal
Ausgabe der Verwendung der Slice-Methode
Verwendung von JQuery in Rails 6 js.erb
So überprüfen Sie Rails-Befehle im Terminal
So überprüfen Sie die neueste Version von io.spring.platform für das Schreiben in pom.xml von Spring (STS)
So stellen Sie die Anzeigezeit in Rails auf japanische Zeit ein
[Android Studio] [Java] So fixieren Sie den Bildschirm vertikal
Verwendung von CommandLineRunner im Spring Batch von Spring Boot
[Android] So erhalten Sie die Einstellungssprache des Terminals
Verwendung von git mit der Leistung von jgit in einer Umgebung ohne git-Befehle
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
Verwendung der Getter / Setter-Methode (in Objektorientierung)
So machen Sie einen Screenshot mit dem Android Studio-Emulator
So stellen Sie die Chronik ein, wenn sich die Zeit in CentOS7 verschiebt
Siehe C ++ im Android Studio-Modul (Java / Kotlin)
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
So erhalten Sie Werte in Echtzeit mit TextWatcher (Android)
So implementieren Sie eine einzeilige Anzeige von TextView in der Android-Entwicklung
So leiten Sie den letzten Tag des Monats in Java ab
So überprüfen Sie die Erweiterung und Größe der hochgeladenen Dateien
Verwendung der link_to-Methode
Wie man Lombok im Frühling benutzt
Verwendung der include? -Methode
[Sprint Boot] Verwendung der drei in org.springframework.jdbc.core.namedparam definierten Arten von SqlParameterSource
Verwendung der Wrapper-Klasse
Verwendung von setDefaultCloseOperation () von JFrame
Verwendung von InjectorHolder in OpenAM
So erhalten Sie die ID des automatisch inkrementierten PRIMAY-Schlüssels in MyBatis
Wie verwende ich Klassen in Java?
Speicherort der Methodendefinition Zusammenfassung der zu überprüfenden Informationen Wenn im Projekt und in Rails / Gem definiert
So überprüfen Sie den Inhalt der Java-Zeichenfolge mit fester Länge
So ermitteln Sie die Länge einer Audiodatei mit Java
So erhöhen Sie den Wert von Map in einer Zeile in Java
[Android] Entwickeln Sie einen Dienst, mit dem Universitätsstudenten den Betriebsstatus von Bussen überprüfen können, die an der Universität verkehren.
So machen Sie den Einzug zu zwei Einzelbyte-Leerzeichen in der JAXB-Implementierung des JDK
Die Geschichte der ersten Veröffentlichung der Android-App im Play Store.
Was war keine faire Verwendung der Java-API-Umleitung unter Android?
So ändern Sie die maximale und maximale Anzahl von POST-Daten in Spark
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
So beschränken Sie die Aktion des Übergangsziels, wenn Sie nicht angemeldet sind
So ändern Sie den Wert einer Variablen an einem Haltepunkt in IntelliJ
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
So ermitteln Sie den absoluten Pfad eines in Java ausgeführten Verzeichnisses
Ist es möglich, die Bibliothek (aar) in die Android-Bibliothek (aar) zu stellen und zu verwenden?
So implementieren Sie die E-Mail-Authentifizierungsfunktion zum Zeitpunkt der Benutzerregistrierung
[Rails] So lösen Sie die Zeitverzögerung von created_at nach der Speichermethode
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
[Java] Verwendung der File-Klasse
Verwendung des benannten Volumes in docker-compose.yml
Verwenden Sie ViewModel, um Android-Apps grob zu drehen