Android UsageStatsManager生成错误的输出?

8
我正在使用这个链接来生成应用程序使用状态。我理解所选的时间间隔是,对于YEARLY间隔,它会在beginTimeendTime持续时间之间聚合每个包的每个YEAR的数据。类似地,对于WEEKLYDAILY间隔,它也应该起作用。
使用WEEKLY,我的代码和输出如下;
代码:
Calendar beginCal = Calendar.getInstance();
beginCal.set(Calendar.DATE, 1);
beginCal.set(Calendar.MONTH, 0);
beginCal.set(Calendar.YEAR, 2012);

Calendar endCall = Calendar.getInstance();
endCall.set(Calendar.DATE, 1);
endCall.set(Calendar.MONTH, 0);
endCall.set(Calendar.YEAR, 2016);

final List<UsageStats> queryUsagesStats= mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_WEEKLY, beginCal.getTimeInMillis(), endCall.getTimeInMillis());    

for(UsageStats us: queryUsagesStats)
{
    long beginTime = us.getFirstTimeStamp();
    String beginDate = df.format(new Date(beginTime));


    long endTime = us.getLastTimeStamp();
    String endDate = df.format(new Date(endTime));
    String lastTime = df.format(new Date(us.getLastTimeUsed()));
    long totalTimeInForeground = us.getTotalTimeInForeground()/1000L;
    System.out.println("Pkg = " + us.getPackageName() + ", beginTime " + beginDate + ", endTime= " + endDate + ", lastTime = " + lastTime + ", totalTime = " + totalTimeInForeground);
}

输出:

Pkg = com.example.newappusagestatistics, beginTime 05/20/2015 17:00:04, endTime= 05/21/2015 17:55:42, lastTime = 05/21/2015 17:55:42, totalTime = 11186
Pkg = com.android.launcher, beginTime 05/20/2015 17:00:04, endTime= 05/21/2015 17:55:42, lastTime = 05/21/2015 17:55:42, totalTime = 1091
Pkg = com.android.browser, beginTime 05/20/2015 17:00:04, endTime= 05/21/2015 17:15:27, lastTime = 05/21/2015 17:15:27, totalTime = 68
Pkg = com.android.sdksetup, beginTime 05/20/2015 17:00:04, endTime= 01/01/1970 15:59:55, lastTime = 05/21/2015 14:41:08, totalTime = 1194
Pkg = com.android.camera, beginTime 05/20/2015 17:00:04, endTime= 01/01/1970 15:59:55, lastTime = 05/21/2015 14:55:32, totalTime = 40
Pkg = com.android.settings, beginTime 05/20/2015 17:00:04, endTime= 01/01/1970 15:59:55, lastTime = 05/21/2015 16:15:19, totalTime = 97
Pkg = com.android.systemui, beginTime 05/20/2015 17:00:04, endTime= 01/01/1970 15:59:55, lastTime = 05/21/2015 14:47:45, totalTime = 

然而,如果我在上面的代码中使用 INTERVAL.DAILY,我只会得到前三行数据。我的时间间隔足够大,应该包含此间隔内所有包的数据。

Pkg = com.example.newappusagestatistics, beginTime 05/21/2015 17:00:00, endTime= 05/21/2015 17:59:18, lastTime = 05/21/2015 17:59:18, totalTime = 3484
Pkg = com.android.launcher, beginTime 05/21/2015 17:00:00, endTime= 05/21/2015 17:59:18, lastTime = 05/21/2015 17:59:18, totalTime = 27
Pkg = com.android.browser, beginTime 05/21/2015 17:00:00, endTime= 05/21/2015 17:15:27, lastTime = 05/21/2015 17:15:27, totalTime = 43

我做错了什么还是我对聚合间隔的理解不正确?任何帮助将不胜感激。谢谢。 编辑1 在查看存储在/data/system/usagestats文件夹中的统计文件时,我发现有两个用于每日统计和一个用于每周统计的文件,如下所示。
每日文件1
<usagestats version="1" endTime="59366071">
<packages>
<package lastTimeActive="59366071" package="com.example.newappusagestatistics" timeActive="4064908" lastEvent="1"/>
<package lastTimeActive="59366020" package="com.android.launcher" timeActive="813728" lastEvent="2"/>
<package lastTimeActive="927475" package="com.android.browser" timeActive="43838" lastEvent="2"/>
</packages>

每日文件2

<usagestats version="1" endTime="86395657">
    <packages>
        <package lastTimeActive="86395657" package="com.example.newappusagestatistics" timeActive="7916365" lastEvent="3" />
        <package lastTimeActive="85743386" package="com.android.launcher" timeActive="1064651" lastEvent="2" />
        <package lastTimeActive="78961499" package="com.android.browser" timeActive="24715" lastEvent="2" />
        <package lastTimeActive="78063875" package="com.android.sdksetup" timeActive="1194161" lastEvent="3" />
        <package lastTimeActive="78928555" package="com.android.camera" timeActive="40775" lastEvent="2" />
        <package lastTimeActive="83715390" package="com.android.settings" timeActive="97012" lastEvent="2" />
        <package lastTimeActive="78461328" package="com.android.systemui" timeActive="4162" lastEvent="2" />
    </packages>

每周
<usagestats version="1" endTime="145761729">
    <packages>
        <package lastTimeActive="145761729" package="com.example.newappusagestatistics" timeActive="11981273" lastEvent="1" />
        <package lastTimeActive="145761678" package="com.android.launcher" timeActive="1878379" lastEvent="2" />
        <package lastTimeActive="87323133" package="com.android.browser" timeActive="68553" lastEvent="2" />
        <package lastTimeActive="78063875" package="com.android.sdksetup" timeActive="1194161" lastEvent="3" />
        <package lastTimeActive="78928555" package="com.android.camera" timeActive="40775" lastEvent="2" />
        <package lastTimeActive="83715390" package="com.android.settings" timeActive="97012" lastEvent="2" />
        <package lastTimeActive="78461328" package="com.android.systemui" timeActive="4162" lastEvent="2" />
    </packages>

整个数据似乎有些混乱。对于同一浏览器应用程序,每天存储的结果都不同,每周存储的结果也不同。


我建议您检查最后4个条目的结束时间,因为它们不可见。虽然我不确定,但从输出结果来看,似乎Android考虑了结束时间,这就阻止了它在输出中显示。 - gaurav jain
在理解 usageManagerManager 的输出方面有任何进展吗?我也无法理解其中的意义。/data/system/usagestats 中的文件与我通过 queryUsageStats 从我的应用程序输出到日志中的事件不匹配。编辑:看起来 /data/system/usagestats/ 中的文件以某种频率更新,并不一定对应事件的频率。来自 @schuberm。 - afzalex
这里也出现了奇怪的时间重叠问题!有人发现了什么吗? - kirtan403
2个回答

10

根据谷歌发布的文档。

(https://developer.android.com/about/versions/android-5.0.html#System)

该系统按应用程序为基础收集使用数据,每日、每周、每月和每年汇总数据。系统保留此数据的最长时间如下:

每日数据:7天

每周数据:4周

每月数据:6个月

每年数据:2年

如果想获得超过7天的统计数据,请将时间间隔从INTERVAL_DAILY更改为INTERVAL_WEEKLY或INTERVAL_YEARLY。 关于此内容的更多详细信息,请参见以下链接。

https://developer.android.com/reference/android/app/usage/UsageStatsManager.html


1
终于找到了一个能帮我理解为什么数据给我错误结果的答案。文档真的太差了! - kirtan403

3

可能会出现混乱。您不能信任queryUsageStats的结果。

在我的情况下,调用

queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 0, today) 

显示过去七天的结果并调用。

queryUsageStats(UsageStatsManager.INTERVAL_DAILY, few-days-ago, today) 

仅显示今天的结果。 few-days-ago 和 today 是所示日期的毫秒时间。检查今天的结果显示,某个应用程序的使用情况丢失,而其他稍后使用的应用程序存在。


4
海尔科,这是预期的结果。你的第一个时间戳是很久以前的。因此你最终获取到的是最近7天的数据,因为这是安卓系统保留统计数据的时间。 - Tyler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接