【问题标题】:Check internet connection status through WiFi connection to raise a notification通过 WiFi 连接检查互联网连接状态以发出通知
【发布时间】: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


    【解决方案1】:

    要检查互联网连接,您需要在查询中包含NET_CAPABILITY_VALIDATED

    public static final 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()
    }
    

    【讨论】:

    • 不幸的是我也试过这个,但也没有触发回调。当我关闭热点的数据时,什么也没有发生。仅在 wifi 关闭时触发。
    • 有趣。通常,互联网 + 验证会为您提供您正在寻找的答案。当您说wifi“关闭”时,您在哪里将其关闭?在热点设备上?另外,你能在getNetworkCallBack() 中覆盖onCapabilitiesChanged 吗?我希望你会看到你的用例的事件触发器。谢谢!
    • 当我关闭设备本身的热点或wifi时,它正在检查是否有wifi,但这当然不是我需要的。我覆盖了onCapabilitiesChanged ,但是当我禁用热点设备上的数据时,我在这里看不到任何日志,但是当我禁用 wifi 时,我会看到日志。
    • 感谢布赖恩的信息。在这种情况下,当您说“禁用来自热点的数据”时,您是否可以用您正在做什么的具体细节来更新您的问题?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2018-02-02
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多