【问题标题】:Android 6.0 Marshmallow UsageStatsManager issue when trying to retrieve foreground app尝试检索前台应用程序时出现 Android 6.0 Marshmallow UsageStatsManager 问题
【发布时间】:2016-01-23 06:25:22
【问题描述】:

每当我尝试查询 UsageStatsManager 的使用情况统计信息时,我都可以正确获取最后运行的应用程序。但是,如果我拉下状态栏并且有新通知,则上次使用的应用程序(基于 UsageStats)将更改为通知的应用程序。结果,我收到前台应用程序已更改的错误警报。

我似乎找不到过滤这些特定抽奖的方法。有什么想法吗?

现在,我使用以下代码查询前台应用程序。该问题仅存在于 Marshmallow 中(5.X 可以正常工作)。

UsageStatsManager mUsageStatsManager = (UsageStatsManager) rotationManager.getSystemService("usagestats");
long time = System.currentTimeMillis();
// We get usage stats for the last 10 seconds
List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 2, time);
// Sort the stats by the last time used
if (stats != null) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
for (UsageStats usageStats : stats) {
    mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
}
if (mySortedMap != null && !mySortedMap.isEmpty()) {
    foregroundApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
} 
}

【问题讨论】:

标签: android usage-statistics usagestatsmanager


【解决方案1】:

在 android 6.0 操作系统中,getUsageStats 函数将列表大小设为零。如需确认,您可以从 Play 商店查看任何锁定应用程序。这些应用程序不适用于 android 6.0。

【讨论】:

  • 我检查它在某些设备上不起作用,例如 micro max。那么你能描述一下误报是什么意思吗?
  • getUsageStats 实际上返回最后使用的应用程序,但在列表顶部返回最后一个在状态栏上绘制的应用程序,即使没有打开它。这就是我说虚惊的原因,因为它说前面的应用程序发生了变化,而它保持不变。
  • 您是否检查过排名靠前的应用程序的上次使用时间。因为我在棉花糖中看到,这个 api 总是在顶部给出一些应用程序列表,最后一次使用为零。所以忽略那些最后使用时间为零的应用程序并检查非零时间值。从非零上次使用列表中,您将获得您的应用程序。告诉我,它解决了你的问题?
  • 感谢您的建议,但是在状态栏(通知)上绘制的应用程序上次使用非零,因此我无法将其与正在进行的前台应用程序区分开来。
  • peraphs 是否可以将通知发布时间与usagestats 中的时间(上次使用时间)进行比较?
【解决方案2】:

您可以查询usageEvent以检查最后一个活动应用的事件是否是UsageEvents.Event.MOVE_TO_FOREGROUND。

获取foregroundApp后,可以参考以下代码:

 UsageEvents usageEvents = mUsageStatsManager.queryEvents(time - 100 * 1000, time);
 UsageEvents.Event event = new UsageEvents.Event();
 // get last event
 while (usageEvent.hasNextEvent()) {
     usageEvent.getNextEvent(event);
 }
 if (foregroundApp.equals(event.getPackageName()) && event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
     return foregroundApp ;
 }

【讨论】:

  • 非常感谢!这暂时解决了问题......直到谷歌决定再次改变它:)......
  • 非常感谢您的回答。我从很多天都在寻找这个。再次非常感谢你,它工作得很好。 :)
  • 解决方案有效,但问题不大。前台应用程序包在棉花糖延迟 3 秒后检测到。通过调试,queryUsageStats 返回快速包信息,之后 queryEvents 需要 3 秒才能在前台获取正确的包。
【解决方案3】:

看看https://github.com/ricvalerio/foregroundappchecker,它可能就是你需要的。提供示例代码,免去实现跨版本前台检测器的痛苦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2022-06-15
    相关资源
    最近更新 更多