2012-03-05 5 views
16

Comme le titre l'indique ... J'essaie de pouvoir obtenir l'IP de l'iface wifi quand il est configuré comme hotspot. Idéalement, j'aimerais trouver quelque chose qui fonctionne pour tous les téléphones.comment obtenir l'adresse IP du hotspot wifi dans Android?

Bien sûr, le WifiManager est inutile lorsqu'il s'agit d'obtenir des informations de l'AP.

Heureusement, je suis en mesure d'obtenir les adresses IP de toutes les interfaces en faisant ceci:

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()) { 
        Log.d("IPs", inetAddress.getHostAddress()); 
       } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e(LOG_TAG, ex.toString()); 
    } 
    return null; 
} 

Ce morceau de code imprimera tous les IP de toutes les interfaces (hotspot wifi inclus). Le problème principal est que je ne trouve pas un moyen d'identifier l'interface WiFi. C'est un problème car certains téléphones ont plusieurs interfaces (WiMax, etc). Voilà ce que j'ai essayé jusqu'à présent:

  • Filtrage par le nom d'affichage wifi iface: ce n'est pas une bonne approche parce que les changements de nom d'affichage d'un dispositif à un autre (wlan0, eth0, wl0.1, etc.) .
  • Filtrage par son adresse mac: presque fonctionne, mais sur certains appareils l'iface du hotspot n'a pas d'adresse MAC (iface.getHardwareAddress() renvoie null) ... donc pas une solution valide.

Des suggestions?

Répondre

0

Voici une solution qui utilise WiFiManagerConnectionInfo pour trouver correspondant NetworkInterface.

Si vous avez juste besoin de l'adresse IP, vous pouvez utiliser:

WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); 
WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
int ipAddress = wifiInfo.getIpAddress(); 
+3

Je suis désolé mais ce n'est pas la solution. Comme je l'ai déjà dit, WifiManager est inutile lorsque l'iface est en mode AP. Android "pense" que le Wifi est désactivé. D'autre part, j'ai essayé quelque chose de similaire à la solution que vous fournissez, mais en utilisant l'adresse MAC au lieu de l'adresse IP. Mais comme je l'ai déjà souligné, cela ne fonctionne pas. Pour une raison quelconque, l'adresse mac de l'iface wifi est nulle (sur certains appareils). – sirlion

+0

@sirlion, est-ce que ACCESS_WIFI_STATE est dans votre manifeste? – tenorsax

+2

Oui, ça l'est. Croyez-moi, cette approche ne fonctionne pas. Vous pouvez l'essayer si vous voulez ..:/ – sirlion

0

Lorsque le Wifi n'est pas configuré comme un point d'accès, il a un nom android-xx7632x324x32423 maison quand hotspot est activée, ce nom est parti. Aussi l'adresse IP change. Donc si vous êtes en mesure d'obtenir la configuration Wifi avant d'activer le hotspot, vous pouvez d'abord utiliser intf.getName() pour obtenir une référence.

Deuxièmement, l'adresse IP a changé, donc si vous savez quelle interface le wifi est en mode CONNECTED, vous pouvez utiliser cette information pour l'identifier plus tard après avoir activé le hotspot.

Voici un code que j'ai utilisé pour le débogage. Je crache tout ce que je peux trouver, fais un énorme gâchis puis nettoie-le quand je pense que mon problème est résolu. GL

import java.net.InetAddress; 
import java.net.NetworkInterface; 
import java.util.Collections; 
import android.net.ConnectivityManager; 

textStatus = (TextView) findViewById(R.id.textStatus); 

try { 
    for (NetworkInterface intf : Collections.list(NetworkInterface.getNetworkInterfaces())) { 
    for (InetAddress addr : Collections.list(intf.getInetAddresses())) { 
     if (!addr.isLoopbackAddress()){ 
     textStatus.append("\n\n IP Address: " + addr.getHostAddress()); 
     textStatus.append("\n" + addr.getHostName()); 
     textStatus.append("\n" + addr.getCanonicalHostName()); 
     textStatus.append("\n\n" + intf.toString()); 
     textStatus.append("\n\n" + intf.getName()); 
     textStatus.append("\n\n" + intf.isUp()); 
     } 
    } 
    } 
} catch (Exception ex) { 
    textStatus.append("\n\n Error getting IP address: " + ex.getLocalizedMessage()); 
} 


connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
allInfo = connectivity.getAllNetworkInfo(); 
mobileInfo = connectivity.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

textStatus.append("\n\n TypeName: " + mobileInfo.getTypeName()); 
textStatus.append("\n State: " + mobileInfo.getState()); 
textStatus.append("\n Subtype: " + mobileInfo.getSubtype()); 
textStatus.append("\n SubtypeName: " + mobileInfo.getSubtypeName()); 
textStatus.append("\n Type: " + mobileInfo.getType()); 
textStatus.append("\n ConnectedOrConnecting: " + mobileInfo.isConnectedOrConnecting()); 
textStatus.append("\n DetailedState: " + mobileInfo.getDetailedState()); 
textStatus.append("\n ExtraInfo: " + mobileInfo.getExtraInfo()); 
textStatus.append("\n Reason: " + mobileInfo.getReason()); 
textStatus.append("\n Failover: " + mobileInfo.isFailover()); 
textStatus.append("\n Roaming: " + mobileInfo.isRoaming()); 

textStatus.append("\n\n 0: " + allInfo[0].toString()); 
textStatus.append("\n\n 1: " + allInfo[1].toString()); 
textStatus.append("\n\n 2: " + allInfo[2].toString()); 
9

Voici ce que je l'ai fait pour obtenir le point d'accès wifi ip:

public String getWifiApIpAddress() { 
    try { 
     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)) { 
         Log.d(TAG, inetAddress.getHostAddress()); 
         return inetAddress.getHostAddress(); 
        } 
       } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e(TAG, ex.toString()); 
    } 
    return null; 
} 

Cela vous donnera l'adresse IP de tout dispositif wifi, ce qui signifie qu'il est non seulement pour le point d'accès. Si vous êtes connecté à un autre réseau wifi (ce qui signifie que vous n'êtes pas en mode hotspot), il renverra une adresse IP.

Vous devez d'abord vérifier si vous êtes en mode AP ou non. Vous pouvez utiliser cette classe pour cela: http://www.whitebyte.info/android/android-wifi-hotspot-manager-class

+0

Salut @ajma, Merci de partager ce précieux code, c'est travail et donnez-moi l'adresse IP à la fois pour "réseau de routeur WiFi simple" et "WiFi Tethering ou hotspot". –

+2

Ce n'est pas 100% correct. J'ai découvert que le nom de l'interface réseau varie beaucoup. HTC Desire Z: wl0.1; Prestigio 3540: ap0; Nexus 5/Samsung DUOS: wlan0. D'un autre côté, dans tous les cas, il n'y a qu'un seul périphérique répertorié (pas de bouclage, etc.). –

+0

ce code ne fonctionne pas sur certains périphériques où l'interface est appelée ap0. Je suggère la correction suivante: if ((intf.getName(). contains ("wlan")) || (intf.getName(). contains ("ap"))) {sur mon téléphone il y a une interface wlan0 mais il n'a pas d'adresse inet parce que l'adresse IP est sur l'ap0. J'ai aussi l'interface loopback dans mon cas. Lorsqu'il est connecté à un routeur wifi, il utilise le wlan0. – Gaucho

2

Vous pouvez l'utiliser. Ce n'est pas testé mais ça devrait marcher.

((WifiManager) mContext.getSystemService(Context.WIFI_SERVICE)).getDhcpInfo().serverAddress 
0
private static byte[] convert2Bytes(int hostAddress) { 
    byte[] addressBytes = { (byte)(0xff & hostAddress), 
      (byte)(0xff & (hostAddress >> 8)), 
      (byte)(0xff & (hostAddress >> 16)), 
      (byte)(0xff & (hostAddress >> 24)) }; 
    return addressBytes; 
} 

public static String getApIpAddr(Context context) { 
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    DhcpInfo dhcpInfo = wifiManager.getDhcpInfo(); 
    byte[] ipAddress = convert2Bytes(dhcpInfo.serverAddress); 
    try { 
     String apIpAddr = InetAddress.getByAddress(ipAddress).getHostAddress(); 
     return apIpAddr; 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
+1

serait génial d'ajouter quelques explications pour le code – Yurets

0

J'utilise la solution de ajma, en changeant intf.getName().contains("wlan") à intf.getName().contains("wl") || intf.getName().contains("ap"). Et cela fonctionne pour de nombreux téléphones mobiles.

Mais il renvoie null lorsque vous juste connecté à un WiFi.

Questions connexes