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 ?
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")
}
})
fun verifyAvailableNetwork(activity:AppCompatActivity):Boolean{
val connectivityManager=activity.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo=connectivityManager.activeNetworkInfo
return networkInfo!=null && networkInfo.isConnected
}
Version la plus courte
val Context.isConnected: Boolean
get() {
return (getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager)
.activeNetworkInfo?.isConnected == true
}
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"/>
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) }
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
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.
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.