oreo lollipop descargar caracteristicas android android-6.0-marshmallow

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