ConnectivityManager.requestNetwork в Android 6.0

Я пытаюсь получить новую ConnectivityManager.bindProcessToNetwork(Network) с помощью ConnectivityManager.requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)

Причина заключается в том, чтобы заставить приложение вызывать будущий запрос в какой-то конкретной сети, у которой нет подключения к интернету (это локальная сеть аппаратной связи). На данный момент система отправляет запросы по сети 3G / 4G и никогда не достигает желаемой сети Wi-Fi, потому что эта сеть не отвечает на проверку соединения, которая вызывает вызов Android.

Когда я requestNetwork метод 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 не входит в группы разрешений .

Я не уверен, что это было предназначено 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 (Context)

Не удается получить разрешение WRITE_SETTINGS


ОБНОВЛЕНИЕ: с Android 6.0.1 CHANGE_NETWORK_STATE автоматически предоставляется по запросу в вашем файле манифеста. Вышеуказанные проверки WRITE_SETTINGS требуются только для 6.0

Это была ошибка Android 6.0. Это исправлено в Android 6.0.1, requestNetwork() можно вызвать, если вы запросите CHANGE_NETWORK_STATE в манифесте. Нет необходимости называть requestPermissions() , это normal разрешение.