背景
谷歌反对使用“"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中它说的是下一件事:
/**
* 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“)。
我还添加了正确的权限:
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />下面是我使用的代码:
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?
另外,如何让用户以最简单的方式授予权限?或者,一旦应用程序试图获取所需的信息,它会自动完成吗?
当尝试使用这个类但用户还没有确认它时会发生什么?
如何使代码返回给我一个真正的应用程序列表?
发布于 2014-10-29 04:01:24
我认为这些文档只是日历的短手。我不认为它真的适用于2014年,但我可能错了。
为了访问UsageStats的实际列表,您需要创建一个具有正确月份、日期和年份的Calendar对象。MRK在另一个答案中是怎么说的。我复制并更正了MRK代码中的错误,以便将来看到它的任何人都能看到它。
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放上去了)
使用访问设置的代码如下。:)
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);发布于 2015-03-02 21:27:48
我已经创建了一个示例,说明如何在我的Github上使用UsageStats。希望它能对某人有所帮助
发布于 2014-10-28 08:05:08
回答最后一个问题:“我如何才能让代码返回给我一个真正的应用程序列表?”queryUsageStats需要以毫秒为单位的开始时间和结束时间,而不是int中的一年值。
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列表(请记住,结束时间不包括最终结果时间范围)。
https://stackoverflow.com/questions/26431795
复制相似问题