自Android Lollipop以来,我们现在拥有一个用于访问应用使用统计信息的API。但是,您的应用必须由用户授予这些权限。
我知道使用Settings.ACTION_USAGE_ACCESS_SETTINGS将用户重定向到这些设置。
现在,我的问题是您如何知道用户已授予您这些权限,以便您可以停止将其重定向到设置。
谢谢!
答案 0 :(得分:7)
你可以简单地查询每日间隔和结束时间当前时间的使用状态,如果没有返回,这意味着用户没有授予权限
@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和结束日期,当前时间必须至少返回今天的使用情况。因此,只有在未授予权限的情况下,它才会为空。
答案 1 :(得分:7)
检查这个答案: Tomik's answer
如果你快点,这是解决方案;)
@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;
}
答案 2 :(得分:2)
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片段的SubActivity。我尝试了以下代码:
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标记为导出,因此据我所知,它无法直接启动SubActivity(使用统计窗口)。唯一的解决方案是将用户带到Securiy设置,并告诉他手动转到使用统计信息视图并启用应用。
如果有人找到更好的解决方案,那就太棒了!
答案 3 :(得分:1)
参见ActivityNotFoundException in Lollipop when trying to launch activity with intent android.settings.USAGE_ACCESS_SETTINGS 为了更好的方法,因为使用方法我们无法辨别时间间隔是否有简单的无统计数据