检查Android的网络连接状态

6
我知道这个问题已经被问了几次,例如这里这里,但是当检查网络连接时,我仍然无法通过类似于这个的方式获得所需的结果。
当我连接到当前没有互联网连接的Wi-Fi路由器时,isAvailable()isConnected()方法都会从网络信息中返回一个布尔值true
这是我手机检测手头情况的截图。 我的手机确实检测到了这种可能性,并显示了警报 确保手机/应用程序实际连接到互联网的唯一方法是轮询/ ping资源以检查连通性,或在尝试发出请求时处理异常吗?

尝试这个解决方案:https://dev59.com/bnI_5IYBdhLWcg3wBuRs#27312494。我在我的几个应用程序中使用过它,它运行良好。至少对我来说是这样的。;-) 但无论如何都试一下吧。 - Siddharth Lele
@IceMAN,感谢您的回复,所以针对我的问题,“确保手机/应用程序实际连接到互联网的唯一方法就是轮询/ ping资源以检查连通性”是否正确? - Ashar
@Ashar:是的,没错。所链接的解决方案通过ping Google DNS 8.8.8.8来检查互联网的连接性。 - Siddharth Lele
1个回答

1
作为@Levit所说,展示了两种检查网络连接/互联网访问的方法。
-- Ping一个服务器
// ICMP 
public boolean isOnline() {
    Runtime runtime = Runtime.getRuntime();
    try {
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int     exitValue = ipProcess.waitFor();
        return (exitValue == 0);
    }
    catch (IOException e)          { e.printStackTrace(); }
    catch (InterruptedException e) { e.printStackTrace(); }

    return false;
}

-- 在互联网上连接套接字(高级)

,保留html。
// TCP/HTTP/DNS (depending on the port, 53=DNS, 80=HTTP, etc.)
public boolean isOnline() {
    try {
        int timeoutMs = 1500;
        Socket sock = new Socket();
        SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);

        sock.connect(sockaddr, timeoutMs);
        sock.close();

        return true;
    } catch (IOException e) { return false; }
}

第二种方法非常快(无论哪种方式),适用于所有设备,非常可靠。但不能在UI线程上运行。

这里有详细信息


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