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.