バックグラウンド
会社のタブレットでさまざまなアプリの使用状況データが必要です。最適なソリューションは、最長の時間にまたがります。ここで、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(..)を介して独自の統計を作成することです。これは、より一貫性があり明確に見えます。
質問
- 何が問題ですか?
- 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" />