如何知道连接的WiFi是Walled Gardened(强制网络门户)?

时间:2016-01-03 11:43:28

标签: android networking captivenetwork

我知道有办法通过检查"http://clients3.google.com/generate_204"之类的响应来确定WiFi网络是否是强制门户网站。

但我的问题有所不同。我们都知道,在连接到WiFi网络的Android上,连接周期会经历类NetworkInfo.DetailedState中提到的一些状态,如AUTHENTICATINGOBTAINING_IPADDRVERIFYING_POOR_LINK此外,其中一个状态是CAPTIVE_PORTAL_CHECK和android系统检查正在连接的网络是否被俘。对于此Android,使用CaptivePortalTracker#isCaptivePortal(InetAddress server)会产生boolean。所以我们确定Android知道连接是否受限制(俘虏)

所以,我的问题是 Android系统是否提供了一些回调或某种状态,我们可以通过它来了解网络是强制网络门户而无需手动检查?由于Android系统已经检查了网络俘虏门户网站,我们需要再次做同样的事情吗?

P.S。我只针对API 19(KitKat 4.4.2)。

2 个答案:

答案 0 :(得分:4)

您可以从网络获取网络功能,并检查它是否具有NET_CAPABILITY_CAPTIVE_PORTAL

API 23

ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
Network activeNetwork=connectivityManager.getActiveNetwork();
NetworkCapabilities networkCapabilities=connectivityManager.getNetworkCapabilities(activeNetwork);
if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)){
        //DO SOMETHING
}

http://developer.android.com/intl/es/reference/android/net/NetworkCapabilities.html

NetworkCapabilities是在API 21中引入的,因此您可以为

执行此操作

API> = 21

ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
Network[] activeNetworks=connectivityManager.getAllNetworks();
for(Network network:activeNetworks){
    if(connectivityManager.getNetworkInfo(network).isConnected()){
        NetworkCapabilities networkCapabilities=connectivityManager.getNetworkCapabilities(network);
        if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)){
           //DO SOMETHING
        }
        break;
    }
}

答案 1 :(得分:0)

聚会可能会迟到。但是,如果文档正确无误,则有一种方法可以从ConnectivityManager中检测强制门户。 https://developer.android.com/reference/android/net/NetworkInfo.DetailedState.html#CAPTIVE_PORTAL_CHECK

ConnectivityManager connectivityManager
                = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
NetworkInfo.DetailedState detailedState = activeNetworkInfo.getDetailedState();
return detailedState == NetworkInfo.DetailedState.CAPTIVE_PORTAL_CHECK;

PS:在API 29中已弃用