安卓,检查互联网连接性。

3
我已经仔细搜索并尝试了各种答案,但它们似乎都不能在我的情况下起作用。我正在寻找一个强大的解决方案,因此,不再多说;
我的应用程序需要连接到没有互联网连接的wifi网络以执行某些任务(本地网络),完成后,它需要断开连接并重新连接到另一个网络,可以是移动网络或具有互联网连接的另一个wifi热点,以进行通信。
我的问题是,当通信队列即将开始通信时(这些通信是在连接更改时触发的),它需要确保实际上有一条通往互联网的路线。
我已经尝试了ConnectivityManager上的各种调用,例如;
isConnected();
isAvailable();

但是即使连接到我无法上网的网络,这些返回值也是true。

我需要一种方法来确保当连接到我的无法上网的网络(或任何其他无法上网的网络,例如BT Openzone,例如未注册和登录时),我可以被告知没有通往互联网的路由,然后当我有路由时,我可以返回一个true。

我考虑了一种可能性是ping,但如果可能的话,我更希望有一种更简洁的方法。

我尝试了requestRouteToHost(),但它没有达到我的期望,实际上会尝试更改连接,这不是我想要的。

谢谢

2个回答

1

Here is the method I use:

public static boolean isNetworkAvailable(final Context context)  {
    return ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo() != null;
}

这是如何使用该方法的步骤:
if (isNetworkAvailable(context)) {
    // code here
} else {
    // code
}

这对于没有连接的活动连接有效吗?我的问题现在相当古老了,但我想接受一个答案。当时我发现没有真正的解决方案(API 方面)不需要 ping 远程主机或类似的操作。 - Hamid
这可以检测用户是否有互联网访问权限。我在所有的应用程序中都使用它。 - Jared Burrows
如果没有互联网,这对WiFi是行不通的。如果第一个查询失败了(例如ping 8.8.8.8),您应该仔细检查该值。 - Viktor Yakunin

0

https://gist.github.com/allco/d50fc10f523293d22fc3d85efe4aaff2

这是我对ConnectivityReporter的Rx版本。它针对API级别>=24和<23使用不同的实现。它仅检查与任何网络的连接。例如,如果有没有互联网的wifi,它将报告true,但对于大多数用户来说,这已经足够了,否则检查可能会非常复杂,因为术语online具有相当广泛的含义。
用法:
ConnectivityReporter(context)
        .statesStream()
        .subscribe(
            { connected -> Timber.d("connectivity state: $connected") },
            { err -> Timber.d(err, "error") }
        )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接