Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 6.0棉花糖UsageStatsManager在尝试检索前台应用程序时出现问题_Android_Usage Statistics_Usagestatsmanager - Fatal编程技术网

Android 6.0棉花糖UsageStatsManager在尝试检索前台应用程序时出现问题

Android 6.0棉花糖UsageStatsManager在尝试检索前台应用程序时出现问题,android,usage-statistics,usagestatsmanager,Android,Usage Statistics,Usagestatsmanager,每当我尝试查询UsageStatsManager的使用情况统计信息时,我都能正确地获取最后一个正在运行的应用程序。但是,如果我拉下状态栏,出现新的通知,最后使用的应用程序(基于UsageStats)将更改为通知的应用程序。结果,我得到前台应用程序已更改的假警报 我似乎找不到一种方法来过滤那些特定的绘图。有什么想法吗 现在,我用以下代码查询前台应用程序。这个问题只存在于棉花糖中(5.X工作正常) usagestastmanager mUsageStatsManager=(usagestastsma

每当我尝试查询UsageStatsManager的使用情况统计信息时,我都能正确地获取最后一个正在运行的应用程序。但是,如果我拉下状态栏,出现新的通知,最后使用的应用程序(基于UsageStats)将更改为通知的应用程序。结果,我得到前台应用程序已更改的假警报

我似乎找不到一种方法来过滤那些特定的绘图。有什么想法吗

现在,我用以下代码查询前台应用程序。这个问题只存在于棉花糖中(5.X工作正常)

usagestastmanager mUsageStatsManager=(usagestastsmanager)rotationManager.getSystemService(“usagestats”);
长时间=System.currentTimeMillis();
//我们得到过去10秒的使用统计数据
List stats=mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,time-1000*2,time);
//按上次使用的时间对统计数据进行排序
if(stats!=null){
SortedMap mySortedMap=newtreemap();
for(UsageStats UsageStats:stats){
mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
}
if(mySortedMap!=null&&!mySortedMap.isEmpty()){
foregroundApp=mySortedMap.get(mySortedMap.lastKey()).getPackageName();
} 
}

在android 6.0操作系统中,getUsageStats函数使列表大小为零。为了确认,您可以从play store查看任何锁定应用程序。这些应用程序在android 6.0中无法运行

您可以查询usageEvent以检查最后一个活动应用程序的事件是否为UsageEvents.event.MOVE_to_前台

获得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 ;
 }

看看,这可能是你需要的。提供示例代码,消除了实施跨版本前台检测器的痛苦。

我检查它在micro max等设备中不起作用。那么您能描述一下获取假警报的含义吗?getUsageStats实际上返回最后使用的应用程序,但也返回列表顶部的,在状态栏上绘制的最后一个应用程序,即使没有打开它。这就是为什么我说假警报,因为它说前面的应用程序已经更改,而它保持不变。您是否检查了位于顶部的应用程序的上次使用时间。因为我在棉花糖中看到,这个api总是在顶部列出一些应用程序,而上次使用的时间为零。因此,忽略那些最后使用时间为零的应用程序,并使用非零时间值进行检查。从非零上次使用列表中,您将获得您的应用程序。让我知道,它解决了您的问题?感谢您的建议,但是状态栏上绘制的应用程序(通知)上次使用了非零,因此我无法将其与正在进行的前台应用程序区分开来。peraphs可以将通知发布时间与usagestats中的时间(上次使用)进行比较?非常感谢!这就解决了目前的问题。。。直到谷歌决定再次改变它:)…非常感谢你的回答。我已经找了很多天了。再次非常感谢,它工作得很好解决方案可行,但问题不大。前台应用程序包在棉花糖中延迟3秒后检测到。通过调试,queryUsageStats返回快速包信息,然后queryEvents需要3秒才能在前台获得正确的包。请查看,这可能是您需要的。
 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 ;
 }