如何在运行Wear OS 3的三星Galaxy Watch 4上检测网络可用性
Wear OS 3.0 网络可用性检测方案
原有代码问题说明
仅检测TRANSPORT_BLUETOOTH或TRANSPORT_WIFI传输类型存在缺陷:TRANSPORT_BLUETOOTH仅代表手表与配对手机的蓝牙传输通道正常,无法验证手机侧是否具备可用上行网络,因此会出现蓝牙通道正常但实际无网络的误判。
优化后检测逻辑
在传输类型检测基础上,新增两项网络能力校验:
NetworkCapabilities.NET_CAPABILITY_INTERNET:标识该网络配置了公网访问路由NetworkCapabilities.NET_CAPABILITY_VALIDATED:标识系统已实际验证该网络可正常访问公网
修正后的代码如下:
fun isNetworkConnected(context: Context): Boolean { val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeNetwork = cm.activeNetwork ?: run { Log.d(TAG, "No Active Network Available") return false } val networkCapabilities = cm.getNetworkCapabilities(activeNetwork) ?: return false // 校验可用传输类型,支持eSIM的手表可额外添加TRANSPORT_CELLULAR val hasValidTransport = networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) return hasValidTransport && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) }
注意事项
- 使用该方法需要在
AndroidManifest.xml中声明权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - 如果应用需要兼容特殊网络环境(如企业内网、自定义DNS导致系统公网验证失败),可去掉
NET_CAPABILITY_VALIDATED校验,改为在发起业务请求前主动发起轻量检测(例如对目标WebService域名发起超时2s的HEAD请求),避免系统验证误判。 - 网络状态是动态变化的,检测结果仅代表当前瞬间状态,所有网络请求必须主动捕获IO异常、超时异常,不能仅依赖提前检测的结果避免崩溃。
- 如果需要实时监听网络状态变化,建议使用
ConnectivityManager.NetworkCallback注册回调,比轮询检测效率更高。
内容的提问来源于stack exchange,提问作者Nishant
相关产品推荐
相关产品推荐

