Android 如何知道已连接的WiFi已被隔离(捕获门户)?
我知道有一种方法可以通过检查类似Android 如何知道已连接的WiFi已被隔离(捕获门户)?,android,networking,captivenetwork,Android,Networking,Captivenetwork,我知道有一种方法可以通过检查类似的响应来确定WiFi网络是否为专属门户http://clients3.google.com/generate_204“ 但我的问题有些不同。我们都知道,在Android上,当我们连接到WiFi网络时,连接周期会经历课程中提到的许多状态,比如认证,获取IPADDR,验证链接不良等等,其中一个状态是“捕获”\u PORTAL\u CHECK,android系统检查正在连接的网络是否为捕获。为此,Android使用了,这将产生一个布尔值。因此,我们确信Android知道
的响应来确定WiFi网络是否为专属门户http://clients3.google.com/generate_204“
但我的问题有些不同。我们都知道,在Android上,当我们连接到WiFi网络时,连接周期会经历课程中提到的许多状态,比如认证
,获取IPADDR
,验证链接不良
等等,其中一个状态是“捕获”\u PORTAL\u CHECK,android系统检查正在连接的网络是否为捕获。为此,Android使用了,这将产生一个布尔值。因此,我们确信Android知道连接是否受到限制(限制)
因此,我的问题是Android系统是否会给出一些回调或某种状态,通过这些回调或状态,我们可以知道网络是捕获门户,而无需手动检查它?由于Android系统已经检查了捕获门户的网络,我们是否需要再次执行相同的操作
另外,我只针对API 19(KitKat 4.4.2)。您可以从网络中获取网络功能,并检查其是否具有网络功能\u捕获\u门户:
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
}
网络功能是在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;
}
}
参加聚会可能会迟到。但是,如果文档是正确的,那么有一种方法可以从ConnectionManager检测捕获门户
注:这在API 29中已被弃用谢谢@isma3l,将对此进行检查并再次返回,谢谢:-)嗨@isma3l,这需要API 23(棉花糖)才能工作。对于以前的版本,我们有类似的功能吗?感谢isma3l,很高兴知道API 121中引入了网络功能。但我特别针对API 19。那么,如何在API 19中使用这一点呢?对于小于21的API有什么要求吗?
ConnectivityManager connectivityManager
= (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
NetworkInfo.DetailedState detailedState = activeNetworkInfo.getDetailedState();
return detailedState == NetworkInfo.DetailedState.CAPTIVE_PORTAL_CHECK;