Мое приложение требует использования 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, и приложение не падает. Будем весьма благодарны за любые указания относительно того, что может происходить.