UsageStatsService не возвращает события для устройства Android 6 - PullRequest
0 голосов
/ 07 июня 2019

Мое приложение требует использования UsageStatsService для сбора метрик для приложений, которые пользователь использует ежедневно. По некоторым причинам, кажется, что UsageStatsService не возвращает события для некоторых устройств, и я понятия не имею, почему. Единственным распространенным фактором, похоже, является версия устройств Android. Похоже, что Android 7, 8 и 9 работают должным образом, а Android 6 не работает.

Примечание. В проекте используется целевая версия Android 9 (28) и минимальная версия Android 5 (21) для Android.

Я попытался очистить проект, удалить приложение, очистить его кеш / хранилище, изменить целевые версии приложения - и я продолжаю появляться пустым.

Я запрашиваю разрешение на начало основной деятельности:

if (CheckSelfPermission(Android.Manifest.Permission.PackageUsageStats) != Permission.Granted)
{
    RequestPermissions(new string[] { Android.Manifest.Permission.PackageUsageStats }, 2);
    Log.Info(_tag, "OnStart: Requesting PackageUsageStats permission");
}

и у моего манифеста также есть указанное разрешение:

<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" android:required="true" />

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

public static bool GetUsageDataPermission(Context context, bool showPrompt = false)
{
    AppOpsManager opsManager;
    AppOpsManagerMode mode;
    AlertDialog.Builder builder;

    // Check usage stats permissions
    opsManager = (AppOpsManager)context.GetSystemService(Context.AppOpsService);
    mode = opsManager.CheckOpNoThrow("android:get_usage_stats", Android.OS.Process.MyUid(), context.PackageName);

    // Prompt if we need too
    if (mode != AppOpsManagerMode.Allowed)
    {
        if (showPrompt)
        {
            builder = new AlertDialog.Builder(context);
            builder.SetMessage("In order for this app to work on your device, you must grant it usage stats permission. Press OK and we will take you to the setting, otherwise press Cancel.");
            builder.SetPositiveButton("Ok", delegate (object dialog, DialogClickEventArgs args)
            {
                context.StartActivity(new Intent(Android.Provider.Settings.ActionUsageAccessSettings));
            });
            builder.SetNegativeButton("Cancel", delegate (object dialog, DialogClickEventArgs args)
            {
                if (dialog != null && dialog is Dialog)
                    ((Dialog)dialog).Dismiss();
            });
            builder.Show();
        }

        return false;
    }

    return true;
}
}

и, наконец, пытается получить статистику, используя следующее:

if (_usageStatsManager == null)
    _usageStatsManager = (UsageStatsManager)GetSystemService(Context.UsageStatsService);

systemTime = Java.Lang.JavaSystem.CurrentTimeMillis();
beginTime = systemTime - 1000;
endTime = systemTime + 1000;

var test1 = _usageStatsManager.QueryEvents(beginTime, endTime);
if (test1.HasNextEvent)
    Log.Debug(_tag, $"Test 1 had events");

var test2 = _usageStatsManager.QueryUsageStats(UsageStatsInterval.Daily, beginTime, endTime);
if (test2.Count > 0)
    Log.Debug(_tag, $"Test 2 had events");

var test3 = _usageStatsManager.QueryAndAggregateUsageStats(beginTime, endTime);
if (test3.Count > 0)
    Log.Debug(_tag, $"Test 3 had events");

По какой-то причине все эти три возвращают результаты на моем устройстве Android 9, но на моем устройстве Android 6 - нет. Я не получаю никаких ошибок в logcat, и приложение не падает. Будем весьма благодарны за любые указания относительно того, что может происходить.

...