获取应用使用情况涉及的类是UsageStatsManager ,用于获取包含特定时间范围的应用包的使用情况统计信息;在Android api21(即Android5.0引入);系统API稳定性好,Android5.0及以后版本都支持,不存在版本兼容问题。
一.判断应用是否具有此权限的方式如下:
public boolean isGrantedUsagePremission(Context context) {
boolean granted = false;
AppOpsManager appOps = (AppOpsManager) context
.getSystemService(Context.APP_OPS_SERVICE);
int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(), context.getPackageName());
if (mode == AppOpsManager.MODE_DEFAULT) {
granted = (context.checkCallingOrSelfPermission(
android.Manifest.permission.PACKAGE_USAGE_STATS)
== PackageManager.PERMISSION_GRANTED);
} else {
granted = (mode == AppOpsManager.MODE_ALLOWED);
}
return granted;
}
以上方法已验证此方法有效
备注 : 常规判断权限方式,PackageManager和Context的权限check 都无法获取到准确的UsageStatsManager
详情如下:不能获取准确UsageStatsManager 权限是否被赋予
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权限能够获取到的信息如下:
系统提供Api获取能力
1.可以获取指定的应用程序当前是否为非活动状态;
方法API:isAppInactive(String packageName)
2.可以获取指定时间范围内的应用统计信息(可以按年、月、日指定获取)
涉及方法:queryUsageStats(int intervalType, long beginTime, long endTime)
统计信息包括:应用的前台使用时长,应用首次启动时间,应用最近一次使用时间等;
3.获取设备在给定时间范围内所处的硬件配置,按指定的时间间隔进行聚合。
涉及方法:queryConfigurations(int intervalType, long beginTime, long endTime)
配置信息包括:orientation、uimode、mcc、mnc、navigation、locale、keyboard等
4.获取给定时间范围的聚合事件统计信息,按指定的时间间隔汇总(粒度为Activity)
涉及方法:queryEventStats(int intervalType, long beginTime, long endTime)
事件包括:锁屏事件、切换前台事件、切换到后台事件、屏幕交互状态事件、屏幕非交互状态事件等以及各事件对应的应用和时间戳
延伸获取信息:
1.可以获取到当前前台应用以及TopActivity
2.统计设备上应用的使用时长
3.统计设备上应用的启动次数
4.循环查询近几秒统计情况,可以监控其他App的启动、前后台切换等时,并做相应操作;
参考文献:
https://developer.android.com/reference/android/app/usage/UsageStatsManager
https://www.jianshu.com/p/fa736d021d1f
https://www.jianshu.com/p/749eab85d95b
https://www.jianshu.com/p/e11cdfaf15dc
https://www.cnblogs.com/KevinSong/p/7978728.html