2016-01-03 3 views
7

Я знаю, что есть способ узнать, является ли сеть Wi-Fi плененным порталом, проверяя реакцию чего-то вроде "http://clients3.google.com/generate_204".Как узнать, что связанный Wi-Fi является Walled Gardened (Captive Portal)?

Но мой вопрос несколько иной. Мы все знаем, что на Android, когда мы подключаемся к сети WiFi, цикл соединения проходит через ряд состояний, упомянутых в классе 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).

ответ

3

Вы можете получить networkcapabilities от сети и проверить, если он имеет 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; 
    } 
} 
+0

Спасибо @ isma3l будет проверить это и вернуться обратно с еще одним спасибо :-) –

+0

Привет @ isma3l, это требует API 23 (Зефир) для работы. У нас есть что-то подобное для предыдущих версий? –

+0

@AnasAzeem см. В редакторе – isma3l

 Смежные вопросы

  • Нет связанных вопросов^_^