为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用UsageStatsManager?

如何使用UsageStatsManager?

饮歌长啸 2019-10-06 16:16:10
背景Google已弃用getRecentTasks“ ActivityManager”类的功能“ ”。现在要做的就是获取当前应用程序已打开的应用程序列表。我什至在StackOverflow上写了一篇关于它的文章,但我注意到这是不可能的。问题我已经发表了一篇关于它的文章(在这里,以及其他人在这里创建的类似文章),并要求重新考虑它,谷歌决定创建一个新类,该类似乎提供了类似的功能(更像是统计信息,但可能也很有用),但我无法找到使用方法。该类称为“ UsageStatsManager”,我的猜测是函数“ queryUsageStats”完成了任务。另外,它似乎具有新的许可权(“ android.permission.PACKAGE_USAGE_STATS”),这是系统许可权,但是这样写:声明许可意味着使用API的意图,设备的用户可以通过“设置”应用程序授予许可。这是有关此新功能的另一个链接。我发现了什么我查看了Android的代码,并注意到“上下文”具有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?另外,如何让用户以最简单的方式授予权限?还是在应用尝试获取所需信息后自动完成?尝试使用此类但用户尚未确认时,该怎么办?如何使代码返回我真实的应用列表?
查看完整描述

3 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

AOSP示例代码中实际上包含一个示例应用程序:developers/samples/android/system/AppUsageStatistics/


它包括UsageStats在应用程序中使用所需的所有位:


在中声明许可 AndroidManifest.xml


<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>


显示设置以授予访问权限 UsageStatsManager


startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));


查询UsageStatsManager统计信息。


Calendar cal = Calendar.getInstance();

cal.add(Calendar.YEAR, -1);

List<UsageStats> queryUsageStats = mUsageStatsManager

        .queryUsageStats(intervalType, cal.getTimeInMillis(),

                System.currentTimeMillis());

创建基于以下内容的应用列表 UsageStats


总结并应用于您的示例:


您似乎正确地请求并授予了访问使用情况统计信息的权限。

您正确获得UsageStats系统服务。

但是,您查询的时间段很短:自纪元以来,参数beginTime和endTime以毫秒为单位。Calendar实例可以通过提供该值getTimeinMillis()。你错误地做的是只给一年的数字(2015和2017如果你运行程序今天)。这些值被解释为自纪元以来的毫秒数,因此间隔只有2毫秒长,是1970年的某个时间。

代替您发布的以下代码片段,您应该复制我在下面发布的示例:


错误:


final int currentYear=Calendar.getInstance().get(Calendar.YEAR);

final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,currentYear-2,currentYear);

正确:


final long currentTime = System.currentTimeMillis(); // Get current time in milliseconds


final Calendar cal = Calendar.getInstance();

cal.add(Calendar.YEAR, -2); // Set year to beginning of desired period.

final long beginTime = cal.getTimeInMillis(); // Get begin time in milliseconds


final List<UsageStats> queryUsageStats=usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, beginTime, currentTime);


查看完整回答
反对 回复 2019-10-06
  • 3 回答
  • 0 关注
  • 1518 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信