2014-02-15 11 views
10

Ich muss die IP-Adresse des Geräts finden, wenn es einen Hotspot hostet. Ich habe diesen Code bisher verwendet:Android Finden Sie die IP-Adresse des Geräts, wenn es einen Hotspot hostet

//if is using Hotspot 
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
    NetworkInterface intf = en.nextElement(); 
    if (intf.getName().contains("wlan")) { 
     for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
      InetAddress inetAddress = enumIpAddr.nextElement(); 
      if (!inetAddress.isLoopbackAddress() && (inetAddress.getAddress().length == 4)) { 
       return inetAddress.getHostAddress(); 
      } 
     } 
    } 
} 

Das funktioniert ganz gut, aber der WiFi NetworkInterface Name unterscheidet sich bei einigen Geräten. Also muss ich zuerst den Namen des Geräts wifi NetworkInterface (für seinen Hotspot) finden. Wie kann ich diesen Namen finden? Oder gibt es einen besseren Ansatz, um die IP-Adresse des Geräts zu finden?

/// die richtige IP-Adresse durch die MAC-Finding scheint auch nicht

Antwort

8

ich, dass die IP-Adresse WifiAP vor kurzem herausgefunden wird in Android fest einprogrammiert. Wenn ein Benutzer diesen Wert nicht manuell geändert hat (ich denke, das ist sehr ungewöhnlich), ist die Verwendung des fest codierten Werts absolut ausreichend. Ich denke, das ist der beste Weg. Die IP-Adresse ist „192.168.43.1“: https://github.com/CyanogenMod/android_frameworks_base/blob/cm-10.1/wifi/java/android/net/wifi/WifiStateMachine.java?source=c#L1299

+1

Funktionierte nicht für mich (auf dem HTC One). Als ich einen WLAN-Hotspot eingerichtet habe, bekam mein Telefon IP 192.168.1.1. Ich fand das heraus, indem ich mich über meine Windows-Box mit dem Hotspot verbinde und die IP-Adresse des WLAN-Gateways über "ipconfig/all" überprüfe. –

0

Bitte ersetzen intf.getName() mit intf.getDisplayName() und dann versuchen, zu arbeiten.

+0

Zitat aus der Dokumentation "Gibt einen lesbaren Namen für diese Netzwerkschnittstelle. ** Auf Android ist dies die gleiche Zeichenfolge wie von getName() zurückgegeben. **" – flx

11

Zuerst habe ich versucht, die MAC-Adresse der WiFi-Schnittstelle zu holen, um sie mit der MAC-Adresse jeder Schnittstelle zu vergleichen. Aber es stellt sich heraus, dass zumindest auf meinem N4 laufenden CM der MAC der WiFi-Schnittstelle beim Einschalten des Hotspots wechselt.

Also schrieb ich etwas Code, um durch die Liste der Geräte zu gehen, um etwas zu finden, um die WLAN-Schnittstelle zu identifizieren. Dieser Code funktioniert perfekt auf meinem N4:

private String getWifiIp() throws SocketException { 
    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); 
      en.hasMoreElements();) { 
     NetworkInterface intf = en.nextElement(); 
     if (intf.isLoopback()) { 
      continue; 
     } 
     if (intf.isVirtual()) { 
      continue; 
     } 
     if (!intf.isUp()) { 
      continue; 
     } 
     if (intf.isPointToPoint()) { 
      continue; 
     } 
     if (intf.getHardwareAddress() == null) { 
      continue; 
     } 
     for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); 
       enumIpAddr.hasMoreElements();) { 
      InetAddress inetAddress = enumIpAddr.nextElement(); 
      if (inetAddress.getAddress().length == 4) { 
       return inetAddress.getHostAddress(); 
      } 
     } 
    } 
    return null; 
} 

nur eine einzige Schnittstelle entspricht allen Bedingungen: wlan0.

Mögliche andere Lösung:

Spaziergang durch einige häufigste Schnittstellennamen und versuchen, sie in der Liste zu finden: new String[] { "wlan0", "eth0", ...];

+0

danke für den gemeinsamen Code. es hat meinen Tag gerettet. –

+2

Diese Antwort sollte die akzeptierte Antwort sein –

+0

Dies wirft Socket-Ausnahme, auch wenn meine hsopt aktiv ist. –

0

Sobald Sie diesen Code Versuchen:

public String getLocalIpAddress() { 
     try { 
      for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
       NetworkInterface intf = en.nextElement(); 
       for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
        InetAddress inetAddress = enumIpAddr.nextElement(); 
        if (!inetAddress.isLoopbackAddress()) { 

         String ip = Formatter.formatIpAddress(inetAddress.hashCode()); 
         Toast.makeText(getApplicationContext(), "***** IP="+ ip, 1).show(); 

         return ip; 
        } 
       } 
      } 
     } catch (SocketException ex) { 
      Toast.makeText(getApplicationContext(), "***** IP="+ex.toString(), 1).show(); 

     } 
     return null; 
    } 

Code über bei oncreat zu überprüfen, Hotspot ist Aktivieren sind nicht .....

WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); 
     wifiManager.setWifiEnabled(true); 
     wifiManager.setWifiEnabled(false); 
     boolean wifiEnabled = wifiManager.isWifiEnabled(); 
     if (wifiEnabled) { 
      Toast.makeText(getApplicationContext(),"on",Toast.LENGTH_SHORT).show(); 
      getLocalIpAddress(); 
     }else { 
       Toast.makeText(getApplicationContext(),"off",Toast.LENGTH_SHORT).show(); 
     } 
2

Dies kann Ihnen helfen.

einen Aufruf an die Schale zu machen für die Netzwerkadapter zu stellen und diejenigen, überprüfen Sie wie müssen in diesem Fall ist wlan so folgen Sie diesem Code

Process p=Runtime.getRuntime().exec("ip link show | grep -o \": wlan[0-9]:\" "); 

BufferedReader readCommandOutput = 
    new BufferedReader(new InputStreamReader(p.getInputStream())); 

String line=null; 
while((line=readCommandOutput.readLine())!=null){ 
    // Lines containing wlan will be returned 
    // parse to get the name of that interface. 
    String interface=line.split(":")[1]; 
    //this is the interface you need. 
} 

if (line==null){ 
    //nothing was found. 
} 

readCommandOutput.close(); 

angebaute Noten

This image is the output of the command on the shell. Or Sie können den Android Terminal Emulator aus dem Play Store verwenden, um diesen Befehl in der Android Shell auszuführen.

für die IP-Adresse abrufen

WifiManager wifi=(WifiManager)getSystemService(WIFI_SERVICE); 
int address=wifi.getDhcpInfo().ipAddress; 
Toast.makeText(this,intToIP(address),1).show();   


public String intToIP(int i) { 
    return ((i & 0xFF) 
      + "." + ((i >> 8) & 0xFF) 
      + "." + ((i >> 16) & 0xFF) 
      + "." + ((i >> 24) & 0xFF)); 
} 
+0

Dies bietet keinen Vorteil. Es speichert nur Geräte mit dem Namen 'wlanX'. Es gibt Geräte, die dort WLAN-Schnittstellen 'ethX' benennen. – flx

+0

Wenn Sie andere brauchen, entfernen Sie einfach wlan in der Regex, aber die Frage, wenn Sie es richtig lesen, er braucht den Namen der Wi-Fi-Schnittstelle. Also thasy, ich erwähnte Wlan drin. – cafebabe1991

+0

nun, die frage ist: wie weiß ich ** welche der geräte ist die wifi-schnittstelle **. Ihre Liste bietet nichts weiter, als die 'NetworkInterface.getNetworkInterfaces()' durchzugehen und nach einem Gerät zu suchen, das mit 'wlan' beginnt. Aber das ist schon in OP. – flx

1

diese Lösung funktioniert, wenn Sie IP des Hotspot-Gerät auf dem gleichen Gerät erhalten möchten, aber nicht wissen, wie es auf angeschlossene Gerät zu bekommen (meist die IP des Servers ist 192.168.43.1 können Sie die Arbeit von hartzucodieren es getan)

public void serverip() 

    { 
    DhcpInfo dhcpInfo = wifiManager.getDhcpInfo(); 
      if (dhcpInfo==null){ 
       Toast.makeText(MainActivity.this, "No ip for server", Toast.LENGTH_SHORT).show(); 
      }else{ 

       Toast.makeText(MainActivity.this, "ip of server "+android.text.format.Formatter.formatIpAddress(dhcpInfo.gateway), Toast.LENGTH_SHORT).show(); 
    } 


      } 
0

user2224350 sagte: „Ich habe vor kurzem, dass die IP-Adresse herausgefunden WifiAP in Android fest einprogrammiert“

Sofern ein Benutzer diesen Wert nicht manuell geändert hat (ich denke, das ist sehr ungewöhnlich), ist die Verwendung des hardcoded Wertes absolut ausreichend. Ich denke, das ist der beste Weg. Die IP-Adresse lautet "192.168.43.1", as seen here.

Dies funktioniert auf meinem Samsung A3 und Huawei PRA-LX1, aber das HTC Desires 530 gibt auch 192.168.1.1 zurück.