android - 如何检查在 Wear OS 3(Samsung Galaxy Watch 4)上运行的应用程序上可用的互联网
问题描述
我正在为三星 Galaxy watch 4 开发一个独立的应用程序。我正在使用互联网连接网络服务 API。三星 Galaxy Watch 4 支持 Wi-Fi 连接,但当手表与手机配对时,它会切换到手机互联网。所以为了检查手表的互联网可用性,我写了下面的代码
fun isNetworkConnected(context: Context): Boolean {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val n = cm.activeNetwork
if (n != null) {
val nc = cm.getNetworkCapabilities(n)
//It will check for both WiFi and Bluetooth transport
return (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
nc.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH))
}
Log.d(TAG,"No Active Network Available")
return false
}
上述代码的问题是,当手表与手机配对时,手机的移动数据和 Wi-Fi 已关闭,手表 Wi-Fi 也已关闭仍然nc.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)
返回 true,我的应用程序崩溃,因为实际上没有可用的互联网。任何人都可以在 Wear OS 3.0 上运行的应用程序上以更好的方式检查互联网可用性吗?
解决方案
您的代码没问题,但用于其他目的,而不是仅检查互联网连接。我建议你看看这个文档https://developer.android.com/training/wearables/data/network-access#requesting-wifi-connectivity
它可能需要对您进行一些返工,因为它将是一个异步回调,但对于您的用例,我认为这是最好的方法。
val callback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
// The Wi-Fi network has been acquired, bind it to use this network by default
connectivityManager.bindProcessToNetwork(network)
}
override fun onLost(network: Network) {
super.onLost(network)
// The Wi-Fi network has been disconnected
}
}
connectivityManager.requestNetwork(
NetworkRequest.Builder()
.addTransportType(
NetworkCapabilities.TRANSPORT_WIFI
).build(),
callback
)
推荐阅读
- python - Python:如何将 mp3 块解码为 PCM 样本?
- sql - postgresSql 删除中间表但用单个关系替换链式关系
- php - Symfony 4 Bundle:AuthenticationUtils 但不存在这样的服务
- php - 将每个值的位置移动到关联数组中的下一个索引
- sql - @Formula 注释错误,使用 + 间隔时出现“模式不存在”
- scala - 如何使用函数式编程更改 Scala 列表中的列表
- xcode - Xamarin 表单项目:没有依赖文件夹
- linux - 在 CircleCi 作业中恢复缓存时权限被拒绝
- javascript - 关于 typeof 类的说明
- gradle - Gradle 中的任务顺序执行问题