8

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

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

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

PS 我只针对 API 19 (KitKat 4.4.2)。

4

2 回答 2

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;
    }
}
于 2016-01-03T12:57:42.563 回答
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 中已弃用

于 2020-02-18T07:42:16.480 回答