Android调用queryAndAggregateUsageStats返回空map问题排查
queryAndAggregateUsageStats 返回空Map的修复方案 你遇到的返回空问题和INTERVAL_BEST间隔类型无关,优先修复代码里的两处逻辑错误即可:
- 未正确初始化
UsageStatsManager实例
你的代码里直接将manager赋值为null,后续的安全调用manager?.queryAndAggregateUsageStats根本不会执行实际查询逻辑,自然拿不到返回值。需要通过系统服务获取实例:val manager = getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager - 查询时间范围参数顺序颠倒
接口要求第一个入参是更早的查询起始时间戳,第二个入参是更晚的查询结束时间戳。你的代码先取当前时间赋值给startTime,再往前推15分钟得到endTime,传入的是一个起始时间晚于结束时间的无效区间,接口无法返回有效数据。需要调整时间计算顺序:先取当前时间作为结束时间,再往前偏移15分钟得到起始时间。
额外前置校验:调用使用统计接口前,必须确认应用已获得
PACKAGE_USAGE_STATS特殊权限,无权限时接口会静默返回空Map,不会抛出异常。可通过以下代码校验权限状态:val appOps = getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager val permissionState = appOps.checkOpNoThrow( AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), packageName ) val isPermissionGranted = permissionState == AppOpsManager.MODE_ALLOWED若权限未授予,需要引导用户到「设置-应用-特殊权限访问-使用情况访问」页面开启对应授权。
修正后的完整代码参考
fun getAppsUsageMap() { // 正确初始化UsageStatsManager val manager = getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager val calendar = Calendar.getInstance() // 调整时间顺序:当前时间为结束时间,往前推15分钟为起始时间 val endTime = calendar.timeInMillis calendar.add(Calendar.MINUTE, -15) val startTime = calendar.timeInMillis println("查询起始时间戳: $startTime") println("查询结束时间戳: $endTime") try { val usageStatsMap = manager.queryAndAggregateUsageStats(startTime, endTime) println("查询结果条目数: ${usageStatsMap.size}") usageStatsMap.forEach { (pkgName, stats) -> println("包名:$pkgName,使用数据:$stats") } } catch (e: Exception) { Log.d("UsageStats", "查询使用统计数据异常", e) } }
内容的提问来源于stack exchange,提问作者ThatGuy
相关产品推荐
相关产品推荐

