2016-01-03 8 views
7

Ich weiß, es gibt eine Möglichkeit herauszufinden, ob ein WiFi-Netzwerk ein Captive-Portal ist, indem Sie die Antwort von etwas wie "http://clients3.google.com/generate_204" überprüfen.Wie kann man wissen, dass das angeschlossene WiFi Walled Gardened (Captive Portal) ist?

Aber meine Frage ist etwas anders. Wir alle wissen, dass auf Android, wenn wir eine Verbindung zu einem WiFi-Netzwerk den Verbindungszyklus durchlaufen eine Reihe von Zustand in der Klasse NetworkInfo.DetailedState, wie AUTHENTICATING, OBTAINING_IPADDR, VERIFYING_POOR_LINK usw. geht auch einer der Staaten ist CAPTIVE_PORTAL_CHECK und Android-System überprüfen, ob die Netzwerk, das verbunden wird, ist gefangen oder nicht. Dazu verwendet Android die CaptivePortalTracker#isCaptivePortal(InetAddress server), die eine boolean ergibt. So sind wir sicher, dass Android weiß, ob die Verbindung eingeschränkt ist (Captive) oder nicht

So ist meine Frage Android-System gibt einige Callback oder ein Zustand, durch den wir das Netzwerk kennen lernen können, ist Captive Portal ohne zu überprüfen es manuell? Da Android-System bereits das Netzwerk für Captive Portal überprüft haben, müssen wir das gleiche noch einmal tun?

P.S. Ich ziele nur auf API 19 (KitKat 4.4.2).

Antwort

3

Sie können die networkcapabilities aus dem Netz erhalten und prüfen, ob es die hat 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 in API 21 eingeführt wurde, so können Sie Tun Sie dies für

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

Thanks @ isma3l, wird dies überprüfen und mit einem weiteren Dank :-) –

+0

Hallo @ isma3l wieder zurück, diese API benötigt 23 (Eibisch) zu arbeiten. Haben wir so etwas für frühere Versionen? –

+0

@AnasAzeem siehe bearbeiten – isma3l

Verwandte Themen