Я разрабатываю приложение экранного времени, с помощью которого пользователь может ежедневно отслеживать свое экранное время, но столкнулся с ошибкой. Экранное время должно показываться ежедневно. В 12 часов ночи он должен быть сброшен и установлен на 0, но в моем случае он не сбрасывается и показывает некоторое экранное время за последние несколько часов и добавляется к экранному времени следующего дня. Я поделюсь с вами необходимым кодом
@SuppressLint("QueryPermissionsNeeded")
override suspend fun getAppUsageStats(date: LocalDate): List {
val usageStateManager =
context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
val startTime = date.atTime(0, 0).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()
Log.d("AppUsageStats", "Start Time Zone: ${ZoneId.systemDefault()}")
val endTime =
date.plusDays(1).atTime(0, 0, 10).atZone(ZoneId.systemDefault()).toInstant()
.toEpochMilli()
// Log the query times to debug potential midnight reset issues
Log.d("AppUsageStats", "Querying from $startTime to $endTime")
// Use queryUsageStats to get detailed usage data
val usageStatsList = usageStateManager.queryUsageStats(
UsageStatsManager.INTERVAL_BEST, // Use INTERVAL_DAILY here
startTime,
endTime
)
val aggregatedUsageStats = usageStatsList.groupBy { it.packageName }
.mapValues { (_, stats) ->
stats.fold(
com.example.focusapp.feature_screen_time.domain.model.UsageStats(
packageName = stats[0].packageName
)
) { acc, stat ->
acc.totalTimeInForeground += stat.totalTimeInForeground
acc
}
}
Log.d("AppUsageStats", "Aggregated Usage Stats: $aggregatedUsageStats")
if (aggregatedUsageStats.isNullOrEmpty()) {
Log.e("AppUsageStats", "No usage stats available for the given date")
return emptyList()
}
// retrieve the list of installed apps
val installedApps =
context.packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
val appNameMap = installedApps.associate { appInfo ->
appInfo.packageName to context.packageManager.getApplicationLabel(appInfo).toString()
}
val appUsageStats = aggregatedUsageStats.mapNotNull { (packageName, usageStats) ->
val icon = try {
context.packageManager.getApplicationIcon(packageName)
} catch (e: PackageManager.NameNotFoundException) {
getFallbackIcon()
}
val appName =
appNameMap[packageName] ?: resolveSystemAppName(packageName) ?: packageName
if (!isSystemApp(packageName)) {
AppUsageStats(
appName = appName,
timeSpent = usageStats.totalTimeInForeground,
packageName = packageName,
icon = icon
)
} else {
null
}
}
return appUsageStats
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... aily-basis
Как получать экранное время каждый день ⇐ Android
Форум для тех, кто программирует под Android
1735265571
Anonymous
Я разрабатываю приложение экранного времени, с помощью которого пользователь может ежедневно отслеживать свое экранное время, но столкнулся с ошибкой. Экранное время должно показываться ежедневно. В 12 часов ночи он должен быть сброшен и установлен на 0, но в моем случае он не сбрасывается и показывает некоторое экранное время за последние несколько часов и добавляется к экранному времени следующего дня. Я поделюсь с вами необходимым кодом
@SuppressLint("QueryPermissionsNeeded")
override suspend fun getAppUsageStats(date: LocalDate): List {
val usageStateManager =
context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
val startTime = date.atTime(0, 0).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()
Log.d("AppUsageStats", "Start Time Zone: ${ZoneId.systemDefault()}")
val endTime =
date.plusDays(1).atTime(0, 0, 10).atZone(ZoneId.systemDefault()).toInstant()
.toEpochMilli()
// Log the query times to debug potential midnight reset issues
Log.d("AppUsageStats", "Querying from $startTime to $endTime")
// Use queryUsageStats to get detailed usage data
val usageStatsList = usageStateManager.queryUsageStats(
UsageStatsManager.INTERVAL_BEST, // Use INTERVAL_DAILY here
startTime,
endTime
)
val aggregatedUsageStats = usageStatsList.groupBy { it.packageName }
.mapValues { (_, stats) ->
stats.fold(
com.example.focusapp.feature_screen_time.domain.model.UsageStats(
packageName = stats[0].packageName
)
) { acc, stat ->
acc.totalTimeInForeground += stat.totalTimeInForeground
acc
}
}
Log.d("AppUsageStats", "Aggregated Usage Stats: $aggregatedUsageStats")
if (aggregatedUsageStats.isNullOrEmpty()) {
Log.e("AppUsageStats", "No usage stats available for the given date")
return emptyList()
}
// retrieve the list of installed apps
val installedApps =
context.packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
val appNameMap = installedApps.associate { appInfo ->
appInfo.packageName to context.packageManager.getApplicationLabel(appInfo).toString()
}
val appUsageStats = aggregatedUsageStats.mapNotNull { (packageName, usageStats) ->
val icon = try {
context.packageManager.getApplicationIcon(packageName)
} catch (e: PackageManager.NameNotFoundException) {
getFallbackIcon()
}
val appName =
appNameMap[packageName] ?: resolveSystemAppName(packageName) ?: packageName
if (!isSystemApp(packageName)) {
AppUsageStats(
appName = appName,
timeSpent = usageStats.totalTimeInForeground,
packageName = packageName,
icon = icon
)
} else {
null
}
}
return appUsageStats
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79039400/how-to-get-screen-time-on-daily-basis[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия