Ответ 1
AppOpsManager
имеет еще один интересный метод:
void startWatchingMode (String op, String packageName, AppOpsManager.OnOpChangedListener callback)
из документации:
Мониторинг изменений в рабочем режиме для данного операционного процесса в данном пакете приложений.
В основном это то, что вы ожидаете → реагировать на разрешение на чтение изменений в использовании статистики использования пакетов.
Что вам нужно сделать, это проверить состояние надбавки, а если оно не предоставлено, откройте "Настройки" и создайте прослушиватель:
private boolean hasPermissionToReadNetworkHistory() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
final AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(), getPackageName());
if (mode == AppOpsManager.MODE_ALLOWED) {
return true;
}
appOps.startWatchingMode(AppOpsManager.OPSTR_GET_USAGE_STATS,
getApplicationContext().getPackageName(),
new AppOpsManager.OnOpChangedListener() {
@Override
@TargetApi(Build.VERSION_CODES.KITKAT)
public void onOpChanged(String op, String packageName) {
int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(), getPackageName());
if (mode != AppOpsManager.MODE_ALLOWED) {
return;
}
appOps.stopWatchingMode(this);
Intent intent = new Intent(MainActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(intent);
}
});
requestReadNetworkHistoryAccess();
return false;
}
private void requestReadNetworkHistoryAccess() {
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);
}
Будьте осторожны и удалите слушателя, вызывающего метод:
void stopWatchingMode (AppOpsManager.OnOpChangedListener callback)
Приведенный выше пример просто открывает основную деятельность приложения. Однако вы можете добавить любое поведение:
- передать параметр дополнительного намерения, чтобы сообщить только что открытую активность, чтобы показать диалог пользователю
- Запустите фоновый сервис, чтобы показать тост, этот пользователь должен предоставить разрешение.
- и т.д...
Отметьте этот репозиторий, поскольку он демонстрирует этот случай и общее использование NetworkStats
.