You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:36:26