web-dev-qa-db-fra.com

ConnectivityManager.requestNetwork dans Android 6.0

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 .

24
Deividi Cavarzan

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

12
Splash

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.

7
cuihtlauac