如何检查 Android 设备是否真正连接到互联网?

7

我制作了一个程序,需要使用wifi连接互联网。我找到了一些信息来检查wifi是否已连接。但在某些情况下,你可以连接wifi AP,但仍然无法使用互联网,比如需要账号和密码才能在https中进行认证,或者wifi AP不能连接互联网。那么,我该如何检查真正的互联网连接?

3个回答

5

只要对 www.google.com 进行 "Ping",它们宕机的可能性非常低。

P.S. 这是我们应用程序中的做法。

public static boolean isReachable(Context context) {
    //  First, check we have connectivity
    final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    final NetworkInfo netInfo = connMgr.getActiveNetworkInfo();

    if (netInfo != null && netInfo.isConnected()) {
        //  check if google is reachable
        try {
            URL url = new URL("http://www.google.com");
            HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(10 * 1000); // Ten seconds timeout in milliseconds
            urlc.connect();
            if (urlc.getResponseCode() == 200) { // success
                return true;
            } else { // Fail
                return false;
            }
        } catch (IOException e) {
            Log.e(TAG, e.getMessage());
            return false;
        }
    } else {
        return false;
    }
}

我认为ping是一个不错的方法,但在Android4.0中,这种方法需要使用新线程来实现。是否有其他方法可以不用新线程? - aaa SA
你应该总是在单独的线程上执行网络操作(而不是主线程),以确保应用程序的响应性。 - Frank
mm,好的,我认为在Android中有一些像WifiManager或NetworkInfo这样的方法可以直接检查真实的互联网。 - aaa SA
但是使用PING存在一个问题。我刚才检查了我的校园WiFi,需要通过类似证书的方式进行账户和密码登陆认证。在这种情况下,我可以得到PING响应,但实际上我不能使用互联网。 - aaa SA
我使用POST方法将数据发送到URL,并检查响应中的特定单词。虽然它能够正常工作,但我不确定这是否是最佳方法,是否有更好的方法? - aaa SA
这是一个非常具体的解决方案,你认为你的客户会遇到同样的问题吗?我更喜欢像上面那样做,并向用户发送一个消息,"可能"需要使用Safari登录。 - Frank

2
请参考以下内容:

创建一个返回布尔值的方法:

    ConnectivityManager connectivityManager;
    NetworkInfo wifiInfo, mobileInfo;

    public Boolean checkNow(Context con){
    try{
        connectivityManager = (ConnectivityManager) con.getSystemService(Context.CONNECTIVITY_SERVICE);
        wifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        mobileInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);  

        if(wifiInfo.isConnected() || mobileInfo.isConnected())
        {
            return true;
        }
    }
    catch(Exception e){
        System.out.println("CheckConnectivity Exception: " + e.getMessage());
    }

    return false;
}   

将上述方法用于您的onCreate()方法中,如下所示:

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

       boolean con = checkNow(getApplicationContext());

       if(con){
           Toast.makeText(getApplicationContext(), "Connection Founded", Toast.LENGTH_SHORT).show();
       }else{
           Toast.makeText(getApplicationContext(), "Connection Not Founded", Toast.LENGTH_SHORT).show();
       }

}

当您运行应用程序时,如果您的设备上有可用的互联网连接,则会提示 "Connection Founded",否则将提示"Connection Not Founded"

1
根据以下方法,如果设备不在飞行模式下或在任何连接模式下没有可用网络,则该方法将返回false,否则返回true。请注意,如果满足以上情况,它将返回null,因此需要检查null netInfo对象来处理它。
public boolean isOnline() {
ConnectivityManager conManager =
    (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = conManager .getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
    return true;
}
return false;

}

请记得在清单文件中获取访问网络状态的权限。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

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