ConnectivityManager.requestNetwork в Android 6.0
Я пытаюсь получить новый ConnectivityManager.bindProcessToNetwork(Network)
с помощью ConnectivityManager.requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)
Причина заключается в том, чтобы заставить приложение вызывать будущий запрос в определенной сети, которая не имеет подключения к Интернету (это локальная сеть аппаратной связи). На данный момент система отправляет запросы по сети 3G/4G и никогда не достигает желаемой сети Wi-Fi, поскольку эта сеть не отвечает на проверку подключения этот вызов для Android.
Когда я вызываю метод requestNetwork
, я получаю следующую ошибку:
java.lang.SecurityException: com.xyz.app was not granted either of these permissions: android.permission.CHANGE_NETWORK_STATE, android.permission.WRITE_SETTINGS.
Я пытаюсь вызвать новый метод для запроса разрешений, доступных в Android 6.0:
requestPermissions(new String[]{Manifest.permission.CHANGE_NETWORK_STATE, Manifest.permission.WRITE_SETTINGS}, PERMISSIONS_REQUEST_WIFI);
Но обратный вызов всегда PackageManager.PERMISSION_DENIED
.
Я установил оба этих разрешения в AndroidManifest.xml
без успеха.
Примечание. Manifest.permission.WRITE_SETTINGS
не находится в разделе Права доступа.
Ответы
Ответ 1
Я не уверен, что это было предназначено Google, но следующее поведение я вижу:
CHANGE_NETWORK_STATE
, кажется, всегда отрицается (как отмечено в комментариях, его разрешение подписи), но это также не имеет значения. Мои сетевые запросы ConnectivityManager кажутся закрытыми только WRITE_SETTINGS, поэтому, если у вас есть WRITE_SETTINGS
, вам не нужно CHANGE_NETWORK_STATE
.
Как отмечено в комментариях, вы делаете это иначе, чем другие разрешения, используя:
Intent goToSettings = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
goToSettings.setData(Uri.parse("package:" + Context.getPackageName()));
startActivity(goToSettings);
И после этого мои сетевые запросы ConnectivityManager были персидскими.
Чтобы проверить, предоставлено ли разрешение до вызова операции ACTION_MANAGE_WRITE_SETTINGS
, этот ответ имеет решение, использующее
Settings.System.canWrite(Контекст)
Невозможно получить разрешение WRITE_SETTINGS
ОБНОВЛЕНИЕ: по состоянию на Android 6.0.1 CHANGE_NETWORK_STATE автоматически предоставляется при запросе в вашем файле манифеста. Вышеуказанные проверки WRITE_SETTINGS требуются только для 6.0
Ответ 2
Это ошибка Android 6.0. Это исправлено в Android 6.0.1, requestNetwork()
можно вызвать, если вы запросите CHANGE_NETWORK_STATE
в манифесте. Не нужно вызывать requestPermissions()
, это a normal
.