J'essaye d'obtenir la nouvelle ConnectivityManager.bindProcessToNetwork(Network)
en utilisant ConnectivityManager.requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)
La raison est de forcer l'application à appeler la future demande dans un réseau spécifique, qui n'a pas de connectivité Internet (c'est un réseau de communication matériel local). À ce stade, le système envoie les demandes sur le réseau 3G/4G et n'atteint jamais le réseau Wifi souhaité, car ce réseau ne répond pas vérification de la connectivité que Android = appeler.
Lorsque j'appelle la méthode requestNetwork
, je reçois l'erreur suivante:
Java.lang.SecurityException: com.xyz.app was not granted either of these permissions: Android.permission.CHANGE_NETWORK_STATE, Android.permission.WRITE_SETTINGS.
J'essaie d'appeler la nouvelle méthode pour demander l'autorisation disponible dans Android 6.0:
requestPermissions(new String[]{Manifest.permission.CHANGE_NETWORK_STATE, Manifest.permission.WRITE_SETTINGS}, PERMISSIONS_REQUEST_WIFI);
Mais le rappel est toujours PackageManager.PERMISSION_DENIED
.
J'ai mis ces deux autorisations dans le AndroidManifest.xml
, sans succès.
Remarque: le Manifest.permission.WRITE_SETTINGS
n'est pas dans Groupes d'autorisations .
Je ne sais pas si cela a été voulu par Google, mais voici le comportement que je vois:
CHANGE_NETWORK_STATE
semble toujours être refusé (comme indiqué dans les commentaires, c'est une autorisation de signature) mais cela ne semble pas non plus avoir d'importance. Mes ConnectivityManager
requêtes réseau semblent toutes être bloquées par WRITE_SETTINGS
uniquement - donc si vous avez WRITE_SETTINGS
vous n'avez pas besoin CHANGE_NETWORK_STATE
.
Comme indiqué dans les commentaires, vous faites cela différemment des autres autorisations, en utilisant:
Intent goToSettings = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
goToSettings.setData(Uri.parse("package:" + Context.getPackageName()));
startActivity(goToSettings);
Et après cela, mes demandes de réseau ConnectivityManager
étaient pêche.
Pour vérifier si l'autorisation est déjà accordée avant d'appeler le ACTION_MANAGE_WRITE_SETTINGS
activité, cette réponse a la solution en utilisant Settings.System.canWrite (Context)
Impossible d'obtenir l'autorisation WRITE_SETTINGS
MISE À JOUR: à partir de Android 6.0.1, CHANGE_NETWORK_STATE
est accordé automatiquement lorsqu'il est demandé dans votre fichier manifeste. Ce qui précède WRITE_SETTINGS
les vérifications ne sont nécessaires que pour 6.0
Il s'agissait d'un bogue Android 6.0. Il est corrigé dans Android 6.0.1, requestNetwork()
peut être appelé si vous demandez CHANGE_NETWORK_STATE
dans le manifeste. Pas besoin d'appeler requestPermissions()
, c'est une permission normal
.