自 Android Lollipop 以来,我们现在有了一个用于访问应用程序使用统计信息的 API。但是,您的应用必须由用户授予这些权限。
我知道使用 Settings.ACTION_USAGE_ACCESS_SETTINGS 将用户重定向到这些设置。
现在,我的问题是您如何知道用户已授予您这些权限,以便您可以停止将他重定向到设置。
谢谢!
自 Android Lollipop 以来,我们现在有了一个用于访问应用程序使用统计信息的 API。但是,您的应用必须由用户授予这些权限。
我知道使用 Settings.ACTION_USAGE_ACCESS_SETTINGS 将用户重定向到这些设置。
现在,我的问题是您如何知道用户已授予您这些权限,以便您可以停止将他重定向到设置。
谢谢!
您可以使用当前时间的每日间隔和结束时间简单地查询 usagestats,如果没有返回任何内容,则表示用户尚未授予权限
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public boolean doIHavePermission(){
final UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
final List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 0, System.currentTimeMillis());
return !queryUsageStats.isEmpty();
}
开始日期为 0 和结束日期为当前时间的每日间隔必须至少返回今天的使用情况。因此只有在未授予权限时才会为空。
检查这个答案: Tomik的答案
如果你快点,这里有解决方案;)
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static boolean usageAccessGranted(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;
}
我偶然发现了同样的问题。在三星 S5 Lollipop 上,使用统计信息不适用于以下代码:
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
但是实际存在使用统计信息。使用以下代码可以打开安全设置:
Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
intent.setComponent(new ComponentName("com.android.settings","com.android.settings.Settings$SecuritySettingsActivity"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
滚动到底部,有使用统计信息。我还检查了日志并通过按使用情况统计信息,您将被定向到包含 UsageStats 片段的子活动。我尝试了以下代码:
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.SubSettings"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
但是遇到了安全异常。问题是他们没有将 SubActivity 标记为export,所以据我所知,它不可能直接启动 SubActivity (使用统计窗口)。唯一的解决方案是将用户带到 Securiy 设置,然后他们告诉他手动转到使用情况统计视图并启用应用程序。
如果有人找到更好的解决方案,那就太好了!
See ActivityNotFoundException in Lollipop when trying to launch activity with intent android.settings.USAGE_ACCESS_SETTINGS for a better way, since with method we cannot discern whether there are simple no stats for the time interval