首页 > 解决方案 > 通过 WiFi 连接检查互联网连接状态以发出通知

问题描述

我尝试从 WiFi 网络获取互联网状态。因此,当设备没有通过 WiFi 连接互联网时,我可以发出通知。所以我现在发现使用不推荐使用的方法的方法是使用ConnectinityManager.NetworkCallbackhttps://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback

我通过使用成功检查WiFi何时断开或连接.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)

当设备没有互联网数据时,我成功检查.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)

但我想要的是一个回调来检测是否有互联网通过它连接的 WiFi。所以我尝试添加上面的两个项目,但它似乎不起作用。我所做的测试是将设备连接到热点,然后禁用来自热点的数据。但它不会触发回调。

这是我使用的具有相关问题的代码(感谢ConnectivityManager.NetworkCallback() -> onAvailable(Network network) 设备连接到内部 wifi 网络时不会触发方法):

import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity


class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
}

private val networkCallback = getNetworkCallBack()

private fun getNetworkCallBack(): ConnectivityManager.NetworkCallback {
    return object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            Toast.makeText(applicationContext, "Internet is on!", Toast.LENGTH_SHORT).show()
        }

        override fun onLost(network: Network) {
            super.onLost(network)
            Toast.makeText(applicationContext, "Internet turns off!", Toast.LENGTH_SHORT).show()
        }
    }
}

private fun getConnectivityManager() = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

private fun getNetworkRequest(): NetworkRequest {
    return NetworkRequest.Builder()
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // internet check works without this but need it for WiFi status
            .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
            .build()
}

override fun onResume() {
    super.onResume()
    getConnectivityManager().registerNetworkCallback(getNetworkRequest(), networkCallback)
}

override fun onPause() {
    super.onPause()
    getConnectivityManager().unregisterNetworkCallback(networkCallback)
}

}

标签: androidkotlinandroid-wifi

解决方案


要检查互联网连接,您需要在查询中包含NET_CAPABILITY_VALIDATED

公共静态最终 int NET_CAPABILITY_VALIDATED

表示此网络上的连接已成功验证。例如,对于具有 NET_CAPABILITY_INTERNET 的网络,这意味着已成功检测到 Internet 连接。

因此,您可以像这样更新您的代码:

private fun getNetworkRequest(): NetworkRequest {
    return NetworkRequest.Builder()
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // internet check works without this but need it for WiFi status
            .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
            .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
            .build()
}

推荐阅读