Attention: La déclaration d'un broadcastreceiver pour android.net.conn.CONNECTIVITY_CHANGE est obsolète pour les applications ciblant N et plus récentes. En général, les applications ne doivent pas se fier à cette diffusion et doivent plutôt utiliser JobScheduler ou GCMNetworkManager.
Comme CONNECTIVITY_CHANGE
est obsolète, nous devrions utiliser une autre façon de faire la même chose
En utilisant NetworkConnectionLiveData
, nous pouvons gérer toutes les versions du système d'exploitation jusqu'à présent et également si le SDK cible est inférieur à Build.VERSION_CODES.LOLLIPOP
alors seulement nous pouvons utiliser broadcastReceiver
La meilleure partie est que cette classe utilise LiveData
donc pas besoin d'enregistrer un récepteur, utilisez LiveData
et il gérera tout
class NetworkConnectionLiveData(val context: Context) : LiveData() {
private var connectivityManager: ConnectivityManager = context.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
private lateinit var connectivityManagerCallback: ConnectivityManager.NetworkCallback
override fun onActive() {
super.onActive()
updateConnection()
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> connectivityManager.registerDefaultNetworkCallback(getConnectivityManagerCallback())
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP -> lollipopNetworkAvailableRequest()
else -> {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
context.registerReceiver(networkReceiver, IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"))
}
}
}
}
override fun onInactive() {
super.onInactive()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
connectivityManager.unregisterNetworkCallback(connectivityManagerCallback)
} else {
context.unregisterReceiver(networkReceiver)
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private fun lollipopNetworkAvailableRequest() {
val builder = NetworkRequest.Builder()
.addTransportType(android.net.NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(android.net.NetworkCapabilities.TRANSPORT_WIFI)
connectivityManager.registerNetworkCallback(builder.build(), getConnectivityManagerCallback())
}
private fun getConnectivityManagerCallback(): ConnectivityManager.NetworkCallback {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
connectivityManagerCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network?) {
postValue(true)
}
override fun onLost(network: Network?) {
postValue(false)
}
}
return connectivityManagerCallback
} else {
throw IllegalAccessError("Should not happened")
}
}
private val networkReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
updateConnection()
}
}
private fun updateConnection() {
val activeNetwork: NetworkInfo? = connectivityManager.activeNetworkInfo
postValue(activeNetwork?.isConnected == true)
}
}
Utilisation du LiveData dans n'importe quelle classe:
NetworkConnectionLiveData(context ?: return)
.observe(viewLifecycleOwner, Observer { isConnected ->
if (!isConnected) {
// Internet Non Disponible
return@Observer
}
// Internet Disponible
})
1 votes
Veuillez vérifier stackoverflow.com/questions/10273614/…
0 votes
Il est plus facile d'utiliser github.com/JobGetabu/DroidNet
0 votes
Essayez cette bibliothèque, tout fonctionne si bien. github.com/andrefio/Rx.Network