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

Android(API 23)使用Kotlin获取UsageStats返回空列表求助

排查Android API 23下UsageStats返回空列表的问题

我来帮你梳理下这个问题,API 23(Android 6.0)上调用UsageStats拿到空列表,几乎都是权限或配置环节没做到位,咱们一步步排查:

1. 先确认权限配置是否完整

UsageStats的权限比较特殊,不是普通的动态权限,得做两步:

  • 首先在AndroidManifest.xml里声明权限:
    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" 
                     tools:ignore="ProtectedPermissions" />
    
    这里加tools:ignore是因为IDE会提示这个权限是系统保护权限,但咱们确实需要声明。
  • 然后必须引导用户跳转到系统设置开启应用使用权限——这个权限没法通过requestPermissions()直接申请,得用Intent跳转:
    val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
    startActivity(intent)
    
    一定要让用户在这个界面里找到你的应用,把开关打开,否则后续调用肯定拿不到数据。

2. 代码里先校验权限是否真的开启

就算用户跳了设置,也可能没开启权限,所以在调用queryUsageStats之前,先加个权限校验:

private fun hasUsageStatsPermission(context: Context): Boolean {
    val appOpsManager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
    val mode = appOpsManager.checkOpNoThrow(
        AppOpsManager.OPSTR_GET_USAGE_STATS,
        android.os.Process.myUid(),
        context.packageName
    )
    return mode == AppOpsManager.MODE_ALLOWED
}

调用这个方法返回true之后,再去获取统计数据,避免白忙活。

3. 检查时间范围是否合理

如果权限没问题,但时间范围选得太小(比如只查最近10秒),而这段时间设备没使用任何应用,也会返回空列表。建议测试时先用大一点的时间范围,比如查询最近一天的数据:

val usageStatsManager = getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
val calendar = Calendar.getInstance()
val endTime = calendar.timeInMillis
// 往前推1天
calendar.add(Calendar.DAY_OF_YEAR, -1)
val startTime = calendar.timeInMillis

// 用INTERVAL_DAILY区间查询
val statsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime)

另外注意参数顺序:intervalType在前,然后是startTime、endTime,别搞反了!

4. 排查设备的电池优化或后台限制

有些厂商的ROM(比如小米、华为)会有严格的电池优化策略,可能会阻止你的应用获取UsageStats数据,尤其是应用在后台的时候。可以让用户:

  • 找到应用的设置页面,关闭电池优化(设为“不优化”)
  • 关闭后台限制、自动清理这类功能

如果需要在代码里引导用户关闭电池优化,可以用这个Intent:

val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
intent.data = Uri.parse("package:" + packageName)
startActivity(intent)

不过这个操作需要用户手动确认,而且有些设备可能会限制这个跳转。

5. 试试不同的时间区间类型

有些设备对INTERVAL_DAILY支持不好,可以试试INTERVAL_BEST或者INTERVAL_HOURLY,换个区间类型再测试看看。

先按上面的步骤逐一排查,大概率能解决问题。

内容的提问来源于stack exchange,提问作者porthfind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:30:31