1

バックグラウンド

会社のタブレットでさまざまなアプリの使用状況データが必要です。最適なソリューションは、最長の時間にまたがります。ここで、UsageStatsManager クエリのいくつかを使用して、過去 2 年間のデータを取得できるはずであることを読みました。

私が試したこと

私は、UsageStatsManager.queryAndAggregateUsageStats(..)でうまくいくと考えましたが、最大約 1 週間の間隔しか返さないことがわかりました。「集計」クエリが機能していなかったので、バケット サイズを明示的に宣言できるように、次のコードを試しました。

val appStats = statsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, 0, Long.MAX_VALUE)

次のような複数の異なる時間間隔を使用してみました。

val appStats = statsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,curTime - TimeUnit.DAYS.toMillis(730), curTime)

私が取得できる最長の間隔は約 1 週間です。

ログの例:

Name: com.example.myusagestatsmanagertestapp
-->  Beginning: Tue Jul 20 10:16:41 CDT 2021
-->     Ending: Mon Jul 26 21:20:47 CDT 2021
--> Time in FG: 186

今いる場所

INTERVAL_YEARLY定数は廃止されていないため、何か間違ったことをしているに違いありません。ただし、このAPIやこのような他の投稿から、この API は大雑把であると推測しました。

私の次の動きは、UsageStatsManager.queryEvents(..)を介して独自の統計を作成することです。これは、より一貫性があり明確に見えます。

質問

  1. 何が問題ですか?
  2. UsageStatsManager のデータは信頼に値しますか?

仕様とコード

私のデバイスは Android 9.0 Samsung Galaxy Active Tab2 です。

フル機能はこちら!

    private fun getIndividualAppUsageDuration(
    statsManager: UsageStatsManager,
    curTime: Long
): Map<String, Long> {
    val appMap: MutableMap<String, Long> = mutableMapOf()

    val apps = statsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY,curTime - TimeUnit.DAYS.toMillis(60), curTime)

    for(app in apps) {
        appMap[app.packageName] = app.totalTimeInForeground
        Log.d("TAG_1", "...\n" +
                "Name: ${app.packageName}\n" +
                "-->  Beginning: ${stringifyMilli(app.firstTimeStamp)}\n" +
                "-->     Ending: ${stringifyMilli(app.lastTimeStamp)}\n" +
                "--> Time in FG: ${TimeUnit.MILLISECONDS.toMinutes(app.totalTimeInForeground)}" )
    }

    return appMap
}

私が使用する権限!

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

0 に答える 0