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
相关产品推荐
相关产品推荐

