android - 通过 WiFi 连接检查互联网连接状态以发出通知
问题描述
我尝试从 WiFi 网络获取互联网状态。因此,当设备没有通过 WiFi 连接互联网时,我可以发出通知。所以我现在发现使用不推荐使用的方法的方法是使用ConnectinityManager.NetworkCallback
(https://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)
}
}
解决方案
要检查互联网连接,您需要在查询中包含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()
}
推荐阅读
- arduino - 如何使用 NRF24L01 使用 Xbox 控制器远距离控制伺服电机
- python - 是否有 python 函数来获取 netcdf 索引、按值计数等
- c++ - ESP8266WebServer - 重构类,std::bind 和 handleRoot 问题
- python - 并行化和线性嵌套 for 循环之间的不匹配
- laravel - 如何解决错误:尝试在 Laravel 中获取非对象的属性“id”
- javascript - Java Script - cloneNode(true),克隆太多项目
- r - R:折叠行并根据数据框中的条件更改值
- javascript - 检索 MongoDB 集群的文档
- jenkins - 詹金斯:错误 403 请求中没有包含有效的碎屑:来自 TFS
- jquery - 如何在鼠标悬停/悬停时暂停 setInterval() 函数?