首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用UsageStatsManager?

如何使用UsageStatsManager?
EN

Stack Overflow用户
提问于 2014-10-17 19:07:40
回答 7查看 63.9K关注 0票数 60

背景

谷歌反对使用“"getRecentTasks(http://developer.android.com/reference/android/app/ActivityManager.html#getRecentTasks(int,%20int%29)”“类的函数ActivityManager。现在,它所做的就是得到当前应用程序已经打开的应用列表。

我甚至写了一篇关于在StackOverflow上的文章,但我注意到这是不可能的。

问题所在

我写了一篇关于它的帖子(这里,以及其他人这里创建的另一篇类似的文章),并要求重新考虑它,谷歌决定创建一个新的类,这个类似乎提供了类似的功能(更像是统计数据,但可能也很有用),但我无法找到如何使用它。

这个类名为"UsageStatsManager",我的猜测是函数UsageStatsManager完成了这项工作。

而且,它似乎有一个新的权限("android.permission.PACKAGE_USAGE_STATS"),这是一个系统权限,但是它写到:

声明权限意味着要使用API,设备的用户可以通过Settings应用程序授予权限。

下面是关于这个新功能的另一个链接。

我所发现的

我看过Android的代码,并注意到"Context“中有USAGE_STATS_SERVICE,在JavaDocs中它说的是下一件事:

代码语言:javascript
复制
/**
 * Use with {@link #getSystemService} to retrieve a {@link
 * android.app.UsageStatsManager} for interacting with the status bar.
 *
 * @see #getSystemService
 * @see android.app.UsageStatsManager
 * @hide
 */
public static final String USAGE_STATS_SERVICE = "usagestats";

奇怪的是,它不仅写着"status bar",而且packageName也不匹配(应该是"android.app.usage.UsageStatsManager“)。

我还添加了正确的权限:

代码语言:javascript
复制
<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />

下面是我使用的代码:

代码语言:javascript
复制
  final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService("usagestats");// Context.USAGE_STATS_SERVICE);
  final int currentYear=Calendar.getInstance().get(Calendar.YEAR);
  final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear);

在模拟器本身,我去了"Settings"->"security"->"apps with usage access“,并启用了我的应用程序。

但是,在运行代码时,我得到的只是一个空列表.

问题是

您如何使用UsageStatsManager

另外,如何让用户以最简单的方式授予权限?或者,一旦应用程序试图获取所需的信息,它会自动完成吗?

当尝试使用这个类但用户还没有确认它时会发生什么?

如何使代码返回给我一个真正的应用程序列表?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-10-29 04:01:24

我认为这些文档只是日历的短手。我不认为它真的适用于2014年,但我可能错了。

为了访问UsageStats的实际列表,您需要创建一个具有正确月份、日期和年份的Calendar对象。MRK在另一个答案中是怎么说的。我复制并更正了MRK代码中的错误,以便将来看到它的任何人都能看到它。

代码语言:javascript
复制
Calendar beginCal = Calendar.getInstance();
beginCal.set(Calendar.DATE, 1);
beginCal.set(Calendar.MONTH, 0);
beginCal.set(Calendar.YEAR, 2012);

Calendar endCal = Calendar.getInstance();
endCal.set(Calendar.DATE, 1);
endCal.set(Calendar.MONTH, 0);
endCal.set(Calendar.YEAR, 2014);

final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginCal.getTimeInMillis(), endCal.getTimeInMillis());

-Credit MRK;被我纠正了(他不小心把beginCal和endCal放上去了)

使用访问设置的代码如下。:)

代码语言:javascript
复制
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);
票数 34
EN

Stack Overflow用户

发布于 2015-03-02 21:27:48

我已经创建了一个示例,说明如何在我的Github上使用UsageStats。希望它能对某人有所帮助

https://github.com/ColeMurray/UsageStatsSample

票数 29
EN

Stack Overflow用户

发布于 2014-10-28 08:05:08

回答最后一个问题:“我如何才能让代码返回给我一个真正的应用程序列表?”queryUsageStats需要以毫秒为单位的开始时间和结束时间,而不是int中的一年值。

代码语言:javascript
复制
Calendar beginCal = Calendar.getInstance();
beginCal.set(Calendar.DATE, 1);
beginCal.set(Calendar.MONTH, 0);
beginCal.set(Calendar.YEAR, 2012);

Calendar endCal = Calendar.getInstance();
endCal.set(Calendar.DATE, 1);
endCal.set(Calendar.MONTH, 0);
endCal.set(Calendar.YEAR, 2014);

final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginCal.getTimeInMillis(), endCal.getTimeInMillis());

这将返回2012年和2013年的UsageStats列表(请记住,结束时间不包括最终结果时间范围)。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26431795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档