Usage Stats Service - queryEvent не работает на устройстве Android 5 (хотя не на всех)

Я использую следующий код, чтобы получить текущее имя пакета приложений переднего плана в моем приложении. У меня есть один пользователь под управлением Android 5, где это всегда возвращает ноль (у меня есть другие пользователи под управлением Android 5, подтверждающие, что мой код работает!). Пользователь устанавливает мое приложение, дает разрешения (я проверил их, мое приложение имеет разрешения на использование USAGE_STATS_SERVICE а потом я звоню getCurrentForegroundPackage и он возвращает ноль. Приложение работает примерно за минуту до этого... Оно работает на многих других устройствах... В чем может быть проблема? Есть идеи?

Код - получение пакета приложений переднего плана

public static String getCurrentForegroundPackage(Context context)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        String foregroundPackage = getCurrentForegroundPackage(context, Constants.CHECK_INTERVAL_SECOND);
        if (foregroundPackage == null)
            foregroundPackage = getCurrentForegroundPackage(context, Constants.CHECK_INTERVAL_MINUTE);
        if (foregroundPackage == null)
            foregroundPackage = getCurrentForegroundPackage(context, Constants.CHECK_INTERVAL_HOUR);
        return foregroundPackage;
    }
    else
    {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
        ComponentName componentInfo = taskInfo.get(0).topActivity;
        return componentInfo.getPackageName();
    }
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static String getCurrentForegroundPackage(Context context, long interval)
{
    long to = System.currentTimeMillis();
    long from = to - interval;
    UsageStatsManager manager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
    UsageEvents usageEvents = manager.queryEvents(from, to);
    return getForeGroundPackage(usageEvents);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static String getForeGroundPackage(UsageEvents usageEvents)
{
    String packageName = null;
    long highestMoveToForegroundTimeStamp = 0;
    while (usageEvents.hasNextEvent())
    {
        UsageEvents.Event event = new UsageEvents.Event();
        usageEvents.getNextEvent(event);
        if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND)
        {
            long timeStamp = event.getTimeStamp();
            if (timeStamp > highestMoveToForegroundTimeStamp)
            {
                packageName = event.getPackageName();
                highestMoveToForegroundTimeStamp = timeStamp;
            }
        }
    }
    return packageName;
}

Код - проверка, есть ли у моего приложения разрешения

@TargetApi(Build.VERSION_CODES.KITKAT)
public static boolean hasUsageAccess()
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        try
        {
            PackageManager packageManager = MainApp.get().getPackageManager();
            ApplicationInfo applicationInfo = packageManager.getApplicationInfo(MainApp.get().getPackageName(), 0);
            AppOpsManager appOpsManager = (AppOpsManager) MainApp.get().getSystemService(Context.APP_OPS_SERVICE);
            int mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, applicationInfo.uid, applicationInfo.packageName);
            return mode == AppOpsManager.MODE_ALLOWED;
        }
        catch (Exception e)
        {
            L.e(PermissionUtil.class, e);
        }
        return false;
    }
    return true;
}

0 ответов

Другие вопросы по тегам