如何检查安卓设备的Wifi已连接但无法访问互联网

14

我想知道为什么安卓手机显示已连接WiFi,但是没有互联网访问。我该如何检查呢?我的代码如下:

ConnectivityManager cn=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
 NetworkInfo nf=cn.getActiveNetworkInfo();

 if(nf != null && nf.isConnected() )
         {
            Flag2=false;
            Log.e("network--------", "1--------------");

            if (cn.getActiveNetworkInfo().isConnectedOrConnecting())
            {Log.e("network--------", "11111111111111--------------");
             }
            else
            {Log.e("network--------", "2222222222222--------------");
            }
        }

 else 
         {
            Log.e("network--------", "2--------------");
 }

请查看此链接:http://stackoverflow.com/a/16437075/2345913 - CRUSADER
在你的if条件语句中,移除==true。 - Sam
1
@Sam 这只是挑刺,使用== true也完全可以正常工作。 - ldam
1
不起作用,@CRUSADER - Smit Patel
我同意你的看法,@LoganDam。 - Smit Patel
4个回答

22

您可以尝试像这样:

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;
}

不要忘记访问权限

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

希望它能够运作 :)


我认为判断互联网是否工作的唯一真正方法是实际尝试访问它,就像这个答案所建议的那样。 - ldam
谢谢你的帮助,但我想要每秒应用一次,而且我不想浪费用户更多的网络数据,无论如何还是非常感谢。 - Smit Patel
我使用了异步方法来实现这个。 - Smit Patel
1
收到NetworkOnMainThreadException异常。因此,它对于同步检查互联网连接没有帮助。 - Madhan
Kotlin 中没有 isReachable() 方法,是否有相应的 Kotlin 实现? - Stephen Hechio
显示剩余2条评论

3
请使用以下内容:
public static boolean isInternetOn(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        // test for connection
        if (cm.getActiveNetworkInfo() != null
                && cm.getActiveNetworkInfo().isAvailable()
                && cm.getActiveNetworkInfo().isConnected()) {
            Log.v(TAG, "Internet is working");
            // txt_status.setText("Internet is working");
            return true;
        } else {
            // txt_status.setText("Internet Connection Not Present");
            Log.v(TAG, "Internet Connection Not Present");
            return false;
        }
    }

希望这能帮助到您。

2
除了您目前正在做的事情外,您可以使用BroadcastReceiver来注册<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>意图,以便在连接性发生变化时通知您的应用程序。请参阅文档:BroadcastReceiverConnectivity Monitoring以获取详细说明。希望这会对您有所帮助!

1
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = manager.getActiveNetworkInfo();
        if (info != null && info.isAvailable()) {
            return true;
        }
        return false;

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