背景
我正在尝试获取应用程序启动统计信息,在Lollipop上,可以使用UsageStatsManager类来实现,如下所示(原始帖子在这里):
清单:
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions"/>
打开一个活动,让用户确认授予您此权限:
startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
获取聚合的统计数据:
private static final String USAGE_STATS_SERVICE ="usagestats"; // Context.USAGE_STATS_SERVICE);
...
final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService(USAGE_STATS_SERVICE);
final Map<String,UsageStats> queryUsageStats=usageStatsManager.queryAndAggregateUsageStats(fromTime,toTime);
问题
我似乎无法检查所需的权限("android.permission.PACKAGE_USAGE_STATS")是否被授予。到目前为止,我尝试过的所有方法都显示它被拒绝了。
代码可以运行,但是权限检查效果不好。
尝试过的方法
你可以使用以下任一方法来检查权限是否已被授予:
String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getContext().checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
或者这样:
String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getPackageManager().checkPermission(permission,getPackageName())== PackageManager.PERMISSION_GRANTED;
即使我已经作为用户授予权限,两者始终都返回被拒绝的结果。
查看UsageStatsManager的代码后,我尝试想出以下解决方法:
UsageStatsManager usm=(UsageStatsManager)getSystemService("usagestats");
Calendar calendar=Calendar.getInstance();
long toTime=calendar.getTimeInMillis();
calendar.add(Calendar.YEAR,-1);
long fromTime=calendar.getTimeInMillis();
final List<UsageStats> queryUsageStats=usm.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,fromTime,toTime);
boolean granted=queryUsageStats!=null&&queryUsageStats!=Collections.EMPTY_LIST;
它起作用了,但仍然是一种变通方法。
问题
为什么我没有得到正确的权限检查结果?
应该采取什么措施来更好地进行检查?