我的应用需要使用UsageStatsService
才能收集用户每天使用的应用的指标。由于某些原因,UsageStatsService
似乎没有返回某些设备的事件,我也不知道为什么。唯一的共同因素似乎是android设备的版本。 Android 7、8和9似乎可以正常工作,而Android 6似乎不起作用。
注意:该项目使用的是Android 9(28)的目标版本,以及android 5(21)的最低android版本。
我尝试清理项目,卸载应用程序,清除其缓存/存储,更改应用程序的目标版本-我一直空着。
我正在请求主要活动的OnStart许可:
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中没有收到任何错误,并且该应用程序没有崩溃。任何有关可能发生的情况的指针将不胜感激。