O ConnectivityManager fornece
uma API que permite solicitar que o dispositivo se conecte a uma rede com base em
várias condições, incluindo recursos do dispositivo e opções de transporte de dados.
A implementação do callback fornece informações ao app sobre o status de conexão do dispositivo, bem como os recursos da rede conectada no momento. A API permite determinar se o dispositivo está conectado a uma rede que atende aos requisitos do app.
Configurar uma solicitação de rede
Para especificar o tipo de transporte da rede, como Wi-Fi ou conexão celular, e os recursos da rede conectada no momento, como conexão de Internet, é necessário configurar uma solicitação de rede.
Declare um NetworkRequest que
descreva as necessidades de conexão de rede do app. O código a seguir cria uma
solicitação para uma rede conectada à Internet e usa uma conexão Wi-Fi,
Ethernet ou celular para o tipo de transporte.
private val networkRequest = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .build()
Algumas conexões podem ser significativamente mais caras do que outras (por exemplo, uma conexão móvel costuma ser cara). Use
NetworkCapabilities#NET_CAPABILITY_NOT_METERED
para determinar se a conexão é cara. Em uma conexão limitada,
tente reduzir o consumo de dados do app ou adie o consumo até que o dispositivo tenha uma
conexão ilimitada.
Configurar um callback de rede
Ao registrar o NetworkRequest com o ConnectivityManager, é necessário
implementar um
NetworkCallback
para receber notificações sobre mudanças no status da conexão e nos recursos
de rede.
As funções mais implementadas no NetworkCallback incluem:
onAvailable()indica que o dispositivo está conectado a uma nova rede que atende aos requisitos de recursos e tipo de transporte especificados noNetworkRequest.onLost()indica que o dispositivo perdeu a conexão com a rede.onCapabilitiesChanged()indica que os recursos da rede mudaram. O objetoNetworkCapabilitiesfornece informações sobre os recursos atuais da rede.
private val networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { // Network is available for use. } // Network capabilities have changed for the network. override fun onCapabilitiesChanged( network: Network, networkCapabilities: NetworkCapabilities ) { val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) if (!unmetered) { // Reduce data usage, or delay it until the network is unmetered. } } override fun onLost(network: Network) { // Lost network connection. } }
Registrar atualizações de rede
Depois de declarar NetworkRequest e NetworkCallback, use as funções
requestNetwork()
ou registerNetworkCallback()
para pesquisar uma rede para se conectar do dispositivo que satisfaça o
NetworkRequest. O status é informado ao NetworkCallback.
val connectivityManager = getSystemService(ConnectivityManager::class.java) connectivityManager.registerNetworkCallback(networkRequest, networkCallback)