lollipop - android marshmallow
ConnectivityManager.requestNetwork en Android 6.0 (2)
Estoy intentando obtener el nuevo ConnectivityManager.bindProcessToNetwork(Network)
usando ConnectivityManager.requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)
El motivo es forzar a la aplicación a llamar a la futura solicitud en alguna red específica, que no tiene conectividad a Internet (es una red de comunicación de hardware local). En este punto, el sistema está enviando las solicitudes a través de la red 3G / 4G y nunca llega a la red Wifi deseada, ya que esta red no responde a la verificación de conectividad de esa llamada de Android.
Cuando llamo al método requestNetwork
, recibo el siguiente error:
java.lang.SecurityException: com.xyz.app was not granted either of these permissions: android.permission.CHANGE_NETWORK_STATE, android.permission.WRITE_SETTINGS.
Intento llamar al nuevo método para solicitar permiso disponible en Android 6.0:
requestPermissions(new String[]{Manifest.permission.CHANGE_NETWORK_STATE, Manifest.permission.WRITE_SETTINGS}, PERMISSIONS_REQUEST_WIFI);
Pero la devolución de llamada siempre es PackageManager.PERMISSION_DENIED
.
Puse estos dos permisos en el AndroidManifest.xml
, sin éxito.
Aviso: Manifest.permission.WRITE_SETTINGS
no está en los grupos de permisos .
Este fue un error de Android 6.0. Se solucionó en Android 6.0.1, se puede llamar a requestNetwork()
si solicita CHANGE_NETWORK_STATE
en el manifiesto. No es necesario llamar a requestPermissions()
, es un permiso normal
.
No estoy seguro de si esto fue pensado por Google, pero el siguiente es el comportamiento que estoy viendo:
CHANGE_NETWORK_STATE
parece ser siempre denegado (como se señala en los comentarios, es un permiso de firma) pero tampoco parece importar. Parece que todas las solicitudes de red de ConnectivityManager
están controladas solo por WRITE_SETTINGS
, por lo que si tiene WRITE_SETTINGS
no necesita CHANGE_NETWORK_STATE
.
Como se señaló en los comentarios, lo hace de manera diferente a otros permisos, utilizando:
Intent goToSettings = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
goToSettings.setData(Uri.parse("package:" + Context.getPackageName()));
startActivity(goToSettings);
Y después de eso, mis solicitudes de red de ConnectivityManager
fueron duraderas.
Para verificar si el permiso ya se otorgó antes de llamar a la actividad ACTION_MANAGE_WRITE_SETTINGS
, esta respuesta tiene la solución utilizando Settings.System.canWrite(Context)
No se puede obtener el permiso WRITE_SETTINGS
ACTUALIZACIÓN: a partir de Android 6.0.1, CHANGE_NETWORK_STATE
se otorga automáticamente cuando se solicita en su archivo de manifiesto. Las comprobaciones WRITE_SETTINGS
anteriores solo son necesarias para 6.0