首页 > 解决方案 > 如何检查在 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 上运行的应用程序上以更好的方式检查互联网可用性吗?

标签: androidwear-osandroid-wear-3.0samsung-galaxy-watch-4

解决方案


您的代码没问题,但用于其他目的,而不是仅检查互联网连接。我建议你看看这个文档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
)

推荐阅读