web-dev-qa-db-fra.com

Vérifier la connectivité Internet Android dans kotlin

J'ai essayé la réponse de this (la réponse acceptée). Je peux utiliser la méthode "PING" mais l'interface utilisateur est devenue noire car elle dit qu'elle bloquera le thread d'interface utilisateur. Cela n'avait pas l'air bien et dérangeait alors j'ai essayé d'utiliser la deuxième méthode "Se connecter à un socket sur Internet" mais je ne sais pas comment utiliser la classe dans Kotlin.

Ceci est le résultat de la conversion de Java en kotlin par Android studio

package com.mockie.daikokuten.helpers

import Android.os.AsyncTask.execute
import Android.os.AsyncTask
import Java.io.IOException
import Java.net.InetSocketAddress
import Java.net.Socket


internal class InternetCheck(private val mConsumer: Consumer) : AsyncTask<Void, Void, Boolean>() {
interface Consumer {
    fun accept(internet: Boolean?)
}

init {
    execute()
}

override fun doInBackground(vararg voids: Void): Boolean? {
    try {
        val sock = Socket()
        sock.connect(InetSocketAddress("8.8.8.8", 53), 1500)
        sock.close()
        return true
    } catch (e: IOException) {
        return false
    }

}

override fun onPostExecute(internet: Boolean?) {
    mConsumer.accept(internet)
}
}

mais JE NE SAIS PAS COMMENT L'UTILISER . J'ai essayé de cette façon:

InternetCheck{ internet-> Log.d("test", "asdasdas") }

Cela n'a pas fonctionné et entraîne une erreur. Il dit que je dois passer "Consumer".

Ma question est Comment utiliser cette classe ?

8
Kakashi

Appelez AsyncTask de cette façon, cela devrait fonctionner. Vous n'avez rien à changer dans votre AsyncTask InternetCheck. Fondamentalement, vous devez passer un objet qui implémente l'interface Consumer définie dans la classe InternetCheck.

InternetCheck(object : InternetCheck.Consumer {
    override fun accept(internet: Boolean?) {
        Log.d("test", "asdasdas")
    }
})
9
Vishnu M.
 fun verifyAvailableNetwork(activity:AppCompatActivity):Boolean{
      val connectivityManager=activity.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
      val networkInfo=connectivityManager.activeNetworkInfo
      return  networkInfo!=null && networkInfo.isConnected
}
11
IramML

Version la plus courte

val Context.isConnected: Boolean
    get() {
        return (getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager)
           .activeNetworkInfo?.isConnected == true
    }
4
Vlad

Vérifier la connectivité dans Android

Kotlin:

fun isOnline(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val networkInfo = connectivityManager.activeNetworkInfo
    return networkInfo != null && networkInfo.isConnected
}

Java:

public static boolean isOnline(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected();
}

les deux méthodes nécessitent les autorisations:

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.INTERNET"/>
4
Jorgesys

J'ai modifié ta classe en ceci

internal class InternetCheck(private val onInternetChecked: (Boolean) -> Unit) : 
AsyncTask<Void, Void, Boolean>() {
 init {
     execute()
 }

 override fun doInBackground(vararg voids: Void): Boolean {
     return try {
         val sock = Socket()
         sock.connect(InetSocketAddress("8.8.8.8", 53), 1500)
         sock.close()
         true
     } catch (e: IOException) {
         false
     }

 }

 override fun onPostExecute(internet: Boolean) {
     onInternetChecked(internet)
 }
}

Vous pouvez donc utiliser la fonction lambda et vous n'avez pas non plus à gérer l'enregistrement nul:

InternetCheck{ internet-> Log.d("Connection", "Is connection enabled? "+internet) }
3
Radim Janda

Vous pouvez l'utiliser comme ceci:

   InternetCheck(object : InternetCheck.Consumer {
      override fun accept(internet: Boolean?) {
         Log.d("test", "asdasdas")
      }
   })

Pour plus d'informations, vous pouvez voir ce fil: https://youtrack.jetbrains.com/issue/KT-777

2
Renan Arceno

Essayez cette méthode utilitaire pour vérifier la disponibilité d'Internet.

fun isNetworkAvailable(context: Context): Boolean {
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        var activeNetworkInfo: NetworkInfo? = null
        activeNetworkInfo = cm.activeNetworkInfo
        return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting
    }

J'espère que cela t'aides.

0
Naveen T P

Ajoutez ces autorisations en haut dans le manifeste

   <uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
   <uses-permission Android:name="Android.permission.INTERNET"/>

et cette fonction devrait faire l'affaire. Il reviendra booléen en fonction de sa connectivité

fun isOnline(context: Context): Boolean {
    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val n = cm.activeNetwork
        if (n != null) {
            val nc = cm.getNetworkCapabilities(n)
    //It will check for both wifi and cellular network
            return nc!!.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
        }
        return false
    } else {
        val netInfo = cm.activeNetworkInfo
        return netInfo != null && netInfo.isConnectedOrConnecting
    }
}

Il a une méthode obsolète ainsi qu'une dernière basée sur votre version api.

0
Syed Afeef