我知道有办法通过检查"http://clients3.google.com/generate_204"
之类的响应来确定WiFi网络是否是强制门户网站。
但我的问题有所不同。我们都知道,在连接到WiFi网络的Android上,连接周期会经历类NetworkInfo.DetailedState中提到的一些状态,如AUTHENTICATING
,OBTAINING_IPADDR
,VERIFYING_POOR_LINK
此外,其中一个状态是CAPTIVE_PORTAL_CHECK
和android系统检查正在连接的网络是否被俘。对于此Android,使用CaptivePortalTracker#isCaptivePortal(InetAddress server)会产生boolean
。所以我们确定Android知道连接是否受限制(俘虏)
所以,我的问题是 Android系统是否提供了一些回调或某种状态,我们可以通过它来了解网络是强制网络门户而无需手动检查?由于Android系统已经检查了网络俘虏门户网站,我们需要再次做同样的事情吗?
P.S。我只针对API 19(KitKat 4.4.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中已弃用