android - 在 kotlin 中检查互联网连接 android

标签 android kotlin

我尝试了 this 的答案(接受的答案)。我可以使用“PING”方法,但是 UI 变黑了,因为它说它会阻塞 UI 线程。它看起来不太好并且令人不安,所以我尝试使用第二种方法“连接到 Internet 上的 Socket”,但我不知道如何在 Kotlin 中使用该类。

这是android studio把Java转成kotlin的结果

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)
}
}

但是我不知道如何使用它。我试过这样:

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

它不起作用并导致错误。它说我必须通过“消费者”。

我的问题是如何使用该类

最佳答案

更新: 从 Android 10 开始使用 NetWorkInfo类及其方法已过时,现在您必须使用 ConectivityManager 类和 getNetworkCapabilities ()方法来自 NetworkCapabilities

如何在 Android 中检查连接性?

Kotlin :

fun isOnline(context: Context): Boolean {
    val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    if (connectivityManager != null) {
        val capabilities =
            connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
        if (capabilities != null) {
            if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                Log.i("Internet", "NetworkCapabilities.TRANSPORT_CELLULAR")
                return true
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                Log.i("Internet", "NetworkCapabilities.TRANSPORT_WIFI")
                return true
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
                Log.i("Internet", "NetworkCapabilities.TRANSPORT_ETHERNET")
                return true
            }
        }
    }
    return false
}

Java:

public static boolean isOnline(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (connectivityManager != null) {
        NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
        if (capabilities != null) {
            if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                Log.i("Internet", "NetworkCapabilities.TRANSPORT_CELLULAR");
                return true;
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                Log.i("Internet", "NetworkCapabilities.TRANSPORT_WIFI");
                return true;
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
                Log.i("Internet", "NetworkCapabilities.TRANSPORT_ETHERNET");
                return true;
            }
        }
    }
    
    return false;
}

这两种方法都需要权限:

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

关于android - 在 kotlin 中检查互联网连接 android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51141970/

相关文章:

Android Studio 在 Ubuntu 18.04 LTS 上不断崩溃

android - 无需拖放即可从主屏幕删除小部件

android - 初始化项目时的“java.lang.NoSuchFieldError: ConstraintLayout_Layout_layoutDescription”

android - 在 Android 上为 2D OpenGL 编程设置视口(viewport)

显示不规则行为的 Android Fragments

java - 获取当前设置的内容 View

android - 如何在 Fragment 中设置 BottomNavigationView

sqlite - 在与kotlin函数的输入匹配的特定列上运行SELECT会抛出空指针

android - 使用 Robolectric 测试 PopUpMenu

java - `MediaStore.MediaColumns.DATA` 已弃用,我应该使用哪一列作为替代