【发布时间】:2021-06-21 10:34:52
【问题描述】:
我尝试从 WiFi 网络获取互联网状态。因此,当设备没有通过 WiFi 连接互联网时,我可以发出通知。
所以我现在发现使用不推荐使用的方法是使用ConnectinityManager.NetworkCallback (https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback)
我使用.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)检查WiFi断开或连接成功
当设备没有.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)的互联网数据时,我成功检查
但我想要的是一个回调来检测是否有互联网通过它连接的 WiFi。所以我尝试添加上面的两个项目,但它似乎不起作用。我所做的测试是将设备连接到热点,然后禁用来自热点的数据。但它不会触发回调。
这是我使用的代码(感谢ConnectivityManager.NetworkCallback() -> onAvailable(Network network) method is not triggered when device connects to a internal wifi network),但存在相关问题:
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)
}
}
【问题讨论】:
标签: android kotlin android-wifi