基于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 的使用有严格限制,确保你的应用符合相关政策。

上一篇      下一篇