基于UsageStatsManager获取指定日期应用使用时长
学习笔记作者:admin日期:2025-05-25点击:30
摘要:介绍如何使用UsageStatsManager获取指定日期的所有应用使用时长,并展示在RecyclerView中。
基于UsageStatsManager获取指定日期应用使用时长
在 Android 中,UsageStatsManager
是一个用于获取设备上应用程序使用统计信息的 API。通过它可以查询指定时间段内应用程序的使用时长。以下是一个完整的解决方案,展示如何使用 UsageStatsManager
获取指定日期(例如 "2025-02-25")所有应用的使用时长。
1. 声明权限
在 AndroidManifest.xml
文件中,添加以下权限声明:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>
注意:PACKAGE_USAGE_STATS
是一个系统级权限,普通应用无法直接获取。用户需要手动进入系统设置,为应用授予“查看使用情况”的权限。
2. 检查并请求权限
在代码中,检查是否已授予权限。如果没有,引导用户前往设置页面授予权限:
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);
可以通过以下方法检查权限是否已授予:
private boolean hasUsageStatsPermission(Context context) {
AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), context.getPackageName());
return mode == AppOpsManager.MODE_ALLOWED;
}
3. 使用 UsageStatsManager 查询数据
以下代码展示了如何使用 UsageStatsManager
获取指定日期(如 "2025-02-25")所有应用的使用时长:
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
public class UsageStatsHelper {
public static void getAppUsageOnSpecificDate(Context context, String targetDate) {
// 确保权限已授予
if (!hasUsageStatsPermission(context)) {
System.out.println("请先授予使用统计权限!");
return;
}
// 初始化 UsageStatsManager
UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
// 解析目标日期
Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
try {
calendar.setTime(dateFormat.parse(targetDate));
} catch (ParseException e) {
System.out.println("日期格式错误!");
return;
}
// 设置查询的时间范围(一天)
long startOfDay = calendar.getTimeInMillis(); // 当天开始时间
calendar.add(Calendar.DAY_OF_YEAR, 1); // 下一天
long endOfDay = calendar.getTimeInMillis(); // 当天结束时间
// 查询 UsageStats
List statsList = usageStatsManager.queryUsageStats(
UsageStatsManager.INTERVAL_DAILY,
startOfDay,
endOfDay
);
// 遍历结果并打印每个应用的使用时长
if (statsList != null && !statsList.isEmpty()) {
for (UsageStats usageStats : statsList) {
long totalTimeInForeground = usageStats.getTotalTimeInForeground();
String packageName = usageStats.getPackageName();
System.out.println("应用包名: " + packageName + ", 使用时长: " + totalTimeInForeground + " 毫秒");
}
} else {
System.out.println("未找到任何使用统计数据!");
}
}
private static boolean hasUsageStatsPermission(Context context) {
AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), context.getPackageName());
return mode == AppOpsManager.MODE_ALLOWED;
}
}
4. 调用方法
在你的 Activity 或其他组件中调用上述方法:
String targetDate = "2025-02-25";
UsageStatsHelper.getAppUsageOnSpecificDate(this, targetDate);
5. 注意事项
1. 权限问题:UsageStatsManager
的使用需要用户手动授予权限。如果用户拒绝授权,应用将无法获取任何数据。
2. 数据范围:UsageStatsManager
只能查询过去一段时间内的数据,默认情况下可能只能查询最近几天的数据。具体范围取决于设备厂商和系统版本。
3. 隐私保护:由于涉及用户隐私,Google 对 UsageStatsManager
的使用有严格限制,确保你的应用符合相关政策。