Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何知道已连接的WiFi已被隔离(捕获门户)?_Android_Networking_Captivenetwork - Fatal编程技术网

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;