2015-07-11 12 views
41

Ich bin mit einem Problem konfrontiert, das 2011 in this tracker issue gemeldet wurde und möchte eine geeignete Problemumgehung entwickeln. Ich möchte alle Netzwerkschnittstellen eines Android-Geräts für den Benutzer anzeigen und sie nach ihrem Typ und ob sie derzeit aktiv sind oder nicht, kategorisieren. Ich bin auf mindestens API 15 ausgerichtet.Workaround-Mapping zwischen NetworkInfo und NetworkInterface

Soweit ich weiß, gibt es zwei Möglichkeiten Netzwerk-Schnittstelle Informationen zu bekommen:

  1. über die integrierte Java NetworkInterface-Klasse NetworkInterface.getNetworkInterfaces(). Dadurch werden NetworkInterface Objekte zurückgegeben, die Informationen wie den Schnittstellennamen, alle der Schnittstelle zugeordneten IP-Adressen usw. enthalten. Für mein Gerät (LG G3) erhalte ich Schnittstellen wie lo, wlan0 und rmnet0. Dies liefert auch Informationen wie die IP-Adresse, MTU, Subnetzmaske und Broadcast-Adresse, die ich brauche.

  2. Über die Android API ConnectivityManager Service mit aConnManager.getAllNetworkInfo(). Dies gibt ungefähr 20 NetworkInfo Objekte für mein Gerät zurück, die meisten sind unbenutzt, aber sie beinhalten die Typen MOBILE, WIFI, BLUETOOTH usw. Dies beinhaltet keine Netzwerkparameter wie IP-Adressen, MTU, etc., wie oben erwähnt.

Die Frage, wie in dem Tracker erklärt ist, dass es keine integrierte Möglichkeit, die NetworkInfo zu einem NetworkInterface oder umgekehrt auf der Karte, und ich würde den Namen der Schnittstelle an den entsprechenden zur Karte zu vermeiden, wie mit NetworkInfo Wenn überhaupt möglich.

Da ich eine Ahnung habe, die nicht möglich ist, gibt es eine Liste aller potenziellen Netzwerkschnittstellennamen für die meisten Anbieter? rmnet[0-9] scheint häufig für Geräte mit Qualcomm-Basisband-Prozessoren und wlan[0-9] für WiFi usw.

Im schlimmsten Fall nehme ich, dass ich den Schnittstellentyp als unbekannt Liste könnte, wenn die Schnittstellennamen keine gemeinsamen Vorlagen entsprechen. Danke im Voraus.

Antwort

1

Seit API 21, können Sie LinkProperties verwenden, um ein NetworkInterface Objekt aus einem Networknetwork Objekt zu erhalten:

ConnectivityManager manager = getSystemService(ConnectivityManager.class); 
LinkProperties prop = manager.getLinkProperties(network);  
NetworkInterface iface = NetworkInterface.getByName(prop.getInterfaceName()); 

Doch obwohl getAllNetworks() soll getAllNetworkInfo() (die ehemalige, in API 21, eingeführt ersetzen hat verwarf letzteres in API 23), ab Android 6.0.1 nicht. getAllNetworks()nicht Liste aller Netzwerke (siehe SO Q#33374766). Sieht nach einem Fehler aus.

Alternativ kann, um den Benutzer über den Status aller Netzwerkverbindungen, eine Reihe von Rückrufen zu informieren, kann für jeden Transporttyp in NetworkCapabilities verfügbar registriert werden (dhTRANSPORT_CELLULAR, TRANSPORT_WIFI, TRANSPORT_ETHERNET, TRANSPORT_BLUETOOTH & TRANSPORT_VPN) Verwendung registerNetworkCallback.

Verwandte Themen