Android Lollipop знать, если приложение как доступ Статистика использования

Начиная с Android Lollipop, у нас теперь есть API для доступа к статистике использования приложений. Однако вашему приложению должны быть предоставлены эти разрешения пользователем.

Я знаю, что для перенаправления пользователя к этим настройкам, используя Settings.ACTION_USAGE_ACCESS_SETTINGS.

Теперь мой вопрос: откуда вы знаете, что пользователь предоставил вам эти разрешения, чтобы вы могли перестать перенаправлять его в настройки?

Спасибо!

4 ответа

Решение

Вы можете просто запросить 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'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;
    }

Я наткнулся на ту же проблему. На Samsung 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);

Прокрутка вниз и есть статистика использования. Я также проверил журналы и нажав статистику использования, вы попадаете на SubActivity, который содержит фрагмент 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 как экспортированную, поэтому, насколько я знаю, невозможно напрямую запустить SubActivity (окно статистики использования). Единственное решение - перенести пользователя в настройки Securiy, а затем попросить его вручную перейти к просмотру статистики использования и включить приложение.

Если кто-то найдет лучшее решение, это будет здорово!

См. ActivityNotFoundException в Lollipop при попытке запуска действия с намерением android.settings.USAGE_ACCESS_SETTINGS для лучшего способа, так как с помощью метода мы не можем определить, есть ли просто нет статистики для временного интервала

Другие вопросы по тегам