2016-01-03 8 views
7

Wiem, że istnieje sposób, aby dowiedzieć się, czy sieć Wi-Fi jest portalem przechwytującym, sprawdzając odpowiedź podobną do takiej, jak "http://clients3.google.com/generate_204".Jak poznać podłączone Wi-Fi to Walled Gardened (Captive Portal)?

Ale moje pytanie jest nieco inne. Wszyscy wiemy, że na Androidzie, gdy łączymy się z siecią Wi-Fi, cykl połączenia przechodzi przez szereg stanów wymienionych w klasie NetworkInfo.DetailedState, takich jak AUTHENTICATING, OBTAINING_IPADDR, VERIFYING_POOR_LINK itd. Ponadto jednym ze stanów jest CAPTIVE_PORTAL_CHECK i system androidowy sprawdzający, czy łączona sieć jest w niewoli lub nie. W tym Android używa CaptivePortalTracker#isCaptivePortal(InetAddress server), co powoduje, że boolean. Więc jesteśmy pewni, że Android wie, czy połączenie jest ograniczone (captive) czy nie

Moje pytanie brzmi: czy system Android daje jakieś połączenie zwrotne lub jakiś stan, dzięki któremu możemy poznać portal Sieć jest zmonopolizowany bez sprawdzania to ręcznie? Skoro system Android już sprawdził sieć dla portalu przechwytującego, czy musimy zrobić to samo ponownie?

P.S. Celuję tylko w interfejs API 19 (KitKat 4.4.2).

Odpowiedz

3

można uzyskać networkcapabilities z sieci i sprawdzić, czy ma go 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 została wprowadzona w API 21, dzięki czemu można zrób to dla

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

Dzięki @ isma3l, to sprawdzi i powrócić z jednym więcej dzięki :-) –

+0

Hi @ isma3l ta wymaga API 23 (Marshmallow) do pracy. Czy mamy coś takiego w poprzednich wersjach? –

+0

@AnasAzeem zobacz edytuj – isma3l

Powiązane problemy