gpt4 book ai didi

java - Android:UsageStatsManager 未返回正确的每日结果

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:59:32 26 4
gpt4 key购买 nike

我正在尝试从 UsageStatsManager 查询 UsageStats,目的是返回每天使用的所有应用程序包以及使用时长。

代码:

public static List<UsageStats> getUsageStatsList(Context context){
UsageStatsManager usm = getUsageStatsManager(context);
Calendar calendar = Calendar.getInstance();
long endTime = calendar.getTimeInMillis();
calendar.add(Calendar.DAY_OF_YEAR, -1);
long startTime = calendar.getTimeInMillis();

List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,startTime, endTime);
return usageStatsList;
}

我有一个每天午夜前触发的警报和查询的 usagestats,然后存储返回的数据。起初一切似乎都运行良好,我得到了包结果和它们的 Activity 时间,但是我添加了一个每小时检查一次结果的功能,这是我发现一个奇怪的地方。

UsageStatsManager 的结果似乎在不同的时间重置,而不是在午夜,考虑到我使用 INTERVAL_DAILY 作为搜索参数,这是我所期望的.

从我保存包的数据来看,“时间”结果似乎在(粗略时间)重置:

  • 凌晨 3 点
  • 中午
  • 下午 3 点
  • 午夜

我意识到包裹时间重置之间存在相关性,但这是注定要发生的吗?

我已经看过以下话题,我从中获得了很多信息: How to use UsageStatsManager?

因此: Android UsageStatsManager producing wrong output?在评论中提到从 queryUsageStats 返回的数据不可信,并且正在返回随机结果。

我是不是漏掉了一些简单的东西,或者 UsageStatsManager 没有正常运行?

最佳答案

我也注意到 API 21 中的这种行为,UsageStats 数据在 API 21 中的维护时间不够长。它在 API 22 中工作正常,如果您 checkin android /data/system/usagestats ,您会发现 API 21 中的条目有限,因此在 API 21 中使用它并不可靠。

对于 API 21+,你会得到一整天usagestats在查询 INTERVAL_DAILY 时根据 UsageStatsManager应用程序接口(interface)。如果您想在一天中的几个小时内查询,您应该使用 queryEvents并按照您自己的逻辑迭代它们。

我尝试了以下方式...

这是为每个应用捕获数据的模态类:

private class AppUsageInfo {
Drawable appIcon;
String appName, packageName;
long timeInForeground;
int launchCount;

AppUsageInfo(String pName) {
this.packageName=pName;
}
}

List<AppUsageInfo> smallInfoList; //global var

这是方法,很简单,顺其自然:

void getUsageStatistics() {

UsageEvents.Event currentEvent;
List<UsageEvents.Event> allEvents = new ArrayList<>();
HashMap<String, AppUsageInfo> map = new HashMap <String, AppUsageInfo> ();

long currTime = System.currentTimeMillis();
long startTime currTime - 1000*3600*3; //querying past three hours

UsageStatsManager mUsageStatsManager = (UsageStatsManager)
mContext.getSystemService(Context.USAGE_STATS_SERVICE);

assert mUsageStatsManager != null;
UsageEvents usageEvents = mUsageStatsManager.queryEvents(usageQueryTodayBeginTime, currTime);

//capturing all events in a array to compare with next element

while (usageEvents.hasNextEvent()) {
currentEvent = new UsageEvents.Event();
usageEvents.getNextEvent(currentEvent);
if (currentEvent.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND ||
currentEvent.getEventType() == UsageEvents.Event.MOVE_TO_BACKGROUND) {
allEvents.add(currentEvent);
String key = currentEvent.getPackageName();
// taking it into a collection to access by package name
if (map.get(key)==null)
map.put(key,new AppUsageInfo(key));
}
}

//iterating through the arraylist
for (int i=0;i<allEvents.size()-1;i++){
UsageEvents.Event E0=allEvents.get(i);
UsageEvents.Event E1=allEvents.get(i+1);

//for launchCount of apps in time range
if (!E0.getPackageName().equals(E1.getPackageName()) && E1.getEventType()==1){
// if true, E1 (launch event of an app) app launched
map.get(E1.getPackageName()).launchCount++;
}

//for UsageTime of apps in time range
if (E0.getEventType()==1 && E1.getEventType()==2
&& E0.getClassName().equals(E1.getClassName())){
long diff = E1.getTimeStamp()-E0.getTimeStamp();
phoneUsageToday+=diff; //gloabl Long var for total usagetime in the timerange
map.get(E0.getPackageName()).timeInForeground+= diff;
}
}
//transferred final data into modal class object
smallInfoList = new ArrayList<>(map.values());

}

关于java - Android:UsageStatsManager 未返回正确的每日结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36238481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com