ConnectivityManager proporciona una API que te permite solicitar que el dispositivo se conecte a una red según diversas condiciones, como las capacidades del dispositivo y las opciones de transporte de datos.
La implementación de la devolución de llamada proporciona información a tu app sobre el estado de conexión del dispositivo, así como las capacidades de la red conectada actualmente. La API te permite determinar si el dispositivo está conectado a una red que cumple con los requisitos de tu app.
Configura una solicitud de red
Para especificar el tipo de transporte de la red, como Wi-Fi o conexión móvil, y las capacidades de la red conectada actualmente, como la conexión a Internet, debes configurar una solicitud de red.
Declara un NetworkRequest que describa las necesidades de conexión de red de tu app. El siguiente código crea una
solicitud para una red que está conectada a Internet y usa una conexión Wi-Fi,
Ethernet o móvil para el tipo de transporte.
Kotlin
val networkRequest = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .build()
Java
NetworkRequest networkRequest = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .build();
Ten en cuenta que algunas conexiones pueden ser mucho más costosas que otras (por
ejemplo, una conexión móvil suele ser costosa). Usa NetworkCapabilities#NET_CAPABILITY_NOT_METERED para determinar si la conexión es costosa. Cuando uses una conexión de uso medido, intenta reducir el consumo de datos de tu app o retrasarlo hasta que el dispositivo tenga una conexión de uso no medido.
Configura una devolución de llamada de red
Cuando registres el NetworkRequest con el ConnectivityManager, debes implementar un NetworkCallback para recibir notificaciones sobre los cambios en el estado de la conexión y las capacidades de la red.
Las funciones que se implementan con mayor frecuencia en NetworkCallback incluyen las
siguientes:
onAvailable()indica que el dispositivo está conectado a una red nueva que cumple con los requisitos de capacidades y tipo de transporte especificados en elNetworkRequest.onLost()indica que el dispositivo perdió la conexión a la red.onCapabilitiesChanged()indica que cambiaron las capacidades de la red. El objetoNetworkCapabilitiesproporciona información sobre las capacidades actuales de la red.
Kotlin
private val networkCallback = object : ConnectivityManager.NetworkCallback() { // network is available for use override fun onAvailable(network: Network) { super.onAvailable(network) } // Network capabilities have changed for the network override fun onCapabilitiesChanged( network: Network, networkCapabilities: NetworkCapabilities ) { super.onCapabilitiesChanged(network, networkCapabilities) val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) } // lost network connection override fun onLost(network: Network) { super.onLost(network) } }
Java
private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(@NonNull Network network) { super.onAvailable(network); } @Override public void onLost(@NonNull Network network) { super.onLost(network); } @Override public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) { super.onCapabilitiesChanged(network, networkCapabilities); final boolean unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); } };
Cómo registrarse para recibir actualizaciones de red
Después de declarar NetworkRequest y NetworkCallback, usa las funciones requestNetwork() o registerNetworkCallback() para buscar una red a la que conectarse desde el dispositivo que satisfaga el NetworkRequest. Luego, el estado se informa al NetworkCallback.
Kotlin
val connectivityManager = getSystemService(ConnectivityManager::class.java) as ConnectivityManager connectivityManager.requestNetwork(networkRequest, networkCallback)
Java
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(ConnectivityManager.class); connectivityManager.requestNetwork(networkRequest, networkCallback);