先看效果图
应用使用时长统计截图
源码地址
Step1 授权
必须确保设备的Android版本>=Android5.1(v22),少部分Android5.0(v21)可以使用UsageStatsManager
在AndroidManifest.xml文件中添加权限说明,这是一个system级别的权限,加上tools:ignore="ProtectedPermissions"可以屏蔽调AS的红线(强逼症作怪)
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
判断是否可以使用AppUsage功能
public static boolean hasAppUsagePermission(Context context) {
UsageStatsManager usageStatsManager = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
}
if (usageStatsManager == null) {
return false;
}
long currentTime = System.currentTimeMillis();
// try to get app usage state in last 2 min
List stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, currentTime - 2 * 60 * 1000, currentTime);
return JListKit.isNotEmpty(stats);
}
打开授权页面
public static void requestAppUsagePermission(Context context) {
Intent intent = new Intent(android.provider.Settings.ACTION_USAGE_ACCESS_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
Log.i(TAG, "Start usage access settings activity fail!");
}
}
Step2 根据获取APP使用情况列表
根据时间范围获取应用使用情况
private void getAppUsage(long beginTime, long endTime) {
String fmt = "yyyy-MM-dd HH:mm:ss";
mHolder.tvTimeRange.setText(String.format("(%s - %s)",
JDateKit.timeToDate(fmt, beginTime),
JDateKit.timeToDate(fmt, endTime)));
// setTitle("数据分析中...");
showLoading("数据分析中...");
// a task can be executed only once,init is requir