如何检查 Android 中的连接

How to check connection in Android

我必须实现一个控制互联网连接存在的功能,我需要准确地知道你是否可以浏览但不知道你是否连接到 wifi 或数据。

可能会出现连接到网络但无法浏览的情况,例如,当您连接到开放的 wifi 网络(例如麦当劳)但要导航时需要登录,连接可用但您无法浏览。

在那种情况下,我就足以利用设置的超时时间(但从未考虑过)。

我尝试实现不同的功能,但我无法得到想要的结果,例如:

public boolean checkConnection() {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();

    boolean response;
    if (netInfo != null && netInfo.isConnected()) {
        try {
            URL url = new URL("http://www.google.it");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(1000);
            conn.connect();
            response = conn.getResponseCode() == 200;
            conn.disconnect();
        } catch (Exception e) {
            response = false;
        }
    } else {
        response = false;
    }
    return response;
}

另一个函数:

public boolean isInternetAvailable(String address, int port, int timeoutMs) {
    try {
        Socket sock = new Socket();
        SocketAddress sockaddr = new InetSocketAddress(address, port);

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

        return true;

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

此函数从不考虑超时。

我该如何解决我的问题??

****************** 编辑 1 ****************

我正在通过 wifi 连接到网络的平板电脑上测试代码,我通过防火墙阻止了所有连接,以模拟 ever question 中描述的情况。使用向我建议的代码,您会注意到超时值从未得到遵守,应用程序出现异常:

Exception: java.net.UnknownHostException: Unable to resolve host "www.google.com": No address associated with hostname.

真正的问题是所有这些功能都花了太长时间才告诉我没有连接,我需要一个在 1/2 秒内响应的功能

你完全可以做其他事情。

在服务器上有一项始终 运行 的服务,并确保您拥有该服务的 url。

每次您要检查连接时,从您的应用程序调用该服务。检查该服务的响应代码,或者可能 return 给你一些东西。根据结果​​代码或服务 returns 的数据,您可以断定您是否有可用的互联网连接。

也许有更简单的方法来完成您的要求,但这个方法肯定有效。

1.public void checkOnlineState() {
    ConnectivityManager CManager =
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo NInfo = CManager.getActiveNetworkInfo();
    if (NInfo != null && NInfo.isConnectedOrConnecting()) {
        if (InetAddress.getByName("www.xy.com").isReachable(timeout))
        {  
         // host reachable  
        }
         else
         {    
         // host not reachable  
         }  
    }
    return;
}
   you can check whether you can access url or not by this code 

检查您是否有输出互联网连接的最简单方法是 ping 一些随机服务器(www.google.com 可能是一个很好的例子):

InetAddress.getByName("www.google.com").isReachable(5000)