Obtenir mon adresse IP wifi Android
Comment puis-je obtenir l'adresse ip de mon téléphone lorsqu'il est connecté par wifi?
j'ai trouvé une méthode ici mais il renvoie quelque chose comme 24.182.239.255 même si je suis sous wifi et je m'attends à quelque chose comme 192.168.1.10.
j'aimerais quelque chose comme:
if (you are under wifi)
String ip4 = getWifiIP()
else
String ip4 = getIPAddress with the method linked before
merci Beaucoup!
9 réponses
si vous souhaitez obtenir l'adresse IP privée de votre appareil lorsque vous êtes connecté au Wi-Fi, vous pouvez essayer ceci.
WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
String ipAddress = Formatter.formatIpAddress(ip);
assurez-vous d'ajouter l'autorisation
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
à votre manifeste.
il faut donc tenir compte du fait que Formateur.formatIpAddress (int) est déprécié:
cette méthode a été dépréciée au niveau 12 de L'API. Utilisez getHostAddress (), qui supporte les adresses IPv4 et IPv6. Cette méthode ne supporte pas les adresses IPv6.
donc en utilisant formatIpAddress(int)
n'est probablement pas une bonne solution à long terme, bien que cela fonctionne.
Voici une solution possible si vous cherchez absolument à obtenir L'IP adresse de l'interface WiFi:
protected String wifiIpAddress(Context context) {
WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
int ipAddress = wifiManager.getConnectionInfo().getIpAddress();
// Convert little-endian to big-endianif needed
if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) {
ipAddress = Integer.reverseBytes(ipAddress);
}
byte[] ipByteArray = BigInteger.valueOf(ipAddress).toByteArray();
String ipAddressString;
try {
ipAddressString = InetAddress.getByAddress(ipByteArray).getHostAddress();
} catch (UnknownHostException ex) {
Log.e("WIFIIP", "Unable to get host address.");
ipAddressString = null;
}
return ipAddressString;
}
Comme indiqué dans les réponses précédentes, vous devez définir les paramètres suivants dans votre AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
notez qu'il ne s'agit que d'une solution d'exemple. Vous devriez prendre le temps de vérifier les valeurs nulles et ainsi de suite pour s'assurer que le UX est lisse.
l'ironie est que, D'un côté, Google désapprouve formatIpAddress(int)
, mais il a encore getIpAddress () renvoie toujours une valeur entière. IP l'adresse étant un int l'exclut également pour être conforme IPv6.
vient ensuite le fait que l'ennui peut ou non être un problème. Je n'ai testé que trois appareils et ils ont tous été little-endian. Il semble que l'Enness peut varier en fonction du matériel, même si nous fonctionnons en VMs, cela peut toujours être un problème. Donc pour être sur le côté sûr j'ai ajouté un contrôle endian dans le code.
getByAddress (byte[]) semble vouloir que la valeur entière soit big endian. D'après les recherches, il semble que network byte order soit big-endian. C'est logique puisqu'une adresse comme 192.168.12.22 est un numéro big-endian.
découvrez HammerNet projet GitHub. Il implémente le code ci-dessus avec un tas de contrôles de santé mentale, la capacité de gérer les valeurs par défaut pour les AVD, les tests unitaires, et d'autres choses. J'ai dû implémenter ceci pour une de mes applications et j'ai décidé d'ouvrir la bibliothèque.
vous obtiendrez ainsi le WiFi IPv4, IPv6 ou les deux.
public static Enumeration<InetAddress> getWifiInetAddresses(final Context context) {
final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
final WifiInfo wifiInfo = wifiManager.getConnectionInfo();
final String macAddress = wifiInfo.getMacAddress();
final String[] macParts = macAddress.split(":");
final byte[] macBytes = new byte[macParts.length];
for (int i = 0; i< macParts.length; i++) {
macBytes[i] = (byte)Integer.parseInt(macParts[i], 16);
}
try {
final Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
final NetworkInterface networkInterface = e.nextElement();
if (Arrays.equals(networkInterface.getHardwareAddress(), macBytes)) {
return networkInterface.getInetAddresses();
}
}
} catch (SocketException e) {
Log.wtf("WIFIIP", "Unable to NetworkInterface.getNetworkInterfaces()");
}
return null;
}
@SuppressWarnings("unchecked")
public static<T extends InetAddress> T getWifiInetAddress(final Context context, final Class<T> inetClass) {
final Enumeration<InetAddress> e = getWifiInetAddresses(context);
while (e.hasMoreElements()) {
final InetAddress inetAddress = e.nextElement();
if (inetAddress.getClass() == inetClass) {
return (T)inetAddress;
}
}
return null;
}
Utilisation:
final Inet4Address inet4Address = getWifiInetAddress(context, Inet4Address.class);
final Inet6Address inet6Address = getWifiInetAddress(context, Inet6Address.class);
Et n'oubliez pas:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
si adb est installé dans le terminal alors faire:
Runtime.getRuntime.exec("adb", "shell", "getprop", "dhcp.wlan0.ipaddress");
basé sur mes journaux de crash, il semble que tous les appareils ne renvoient pas l'adresse WiFi mac.
Voici une version plus propre de la réponse la plus populaire.
final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
final ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
byteBuffer.putInt(wifiInfo.getIpAddress());
try {
final InetAddress inetAddress = InetAddress.getByAddress(null, byteBuffer.array());
} catch (UnknownHostException e) {
//TODO: Return null?
}
Trouvé cette belle réponse, https://gist.github.com/stickupkid/1250733
WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ipString = String.format(“%d.%d.%d.%d”, (ip & 0xff), (ip >> 8 & 0xff), (ip >> 16 & 0xff), (ip >> 24 & 0xff));
Ajouter La Permission Suivante.
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
WifiManager initialiser dans onCreate.
WifiManager wifiMgr = (WifiManager) getContext().getSystemService(context.WIFI_SERVICE);
Utiliser la fonction suivante.
public void WI-FI_IP() {
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
String ipAddress = Formatter.formatIpAddress(ip);
}
le code suivant provient des paramètres AOSP. Il obtenir l'ip de la liaison active, peu importe wifi ou mobile. C'est la façon la plus commune.
/**
* Returns the default link's IP addresses, if any, taking into account IPv4 and IPv6 style
* addresses.
* @param context the application context
* @return the formatted and newline-separated IP addresses, or null if none.
*/
public static String getDefaultIpAddresses(ConnectivityManager cm) {
LinkProperties prop = cm.getActiveLinkProperties();
return formatIpAddresses(prop);
}
private static String formatIpAddresses(LinkProperties prop) {
if (prop == null) return null;
Iterator<InetAddress> iter = prop.getAllAddresses().iterator();
// If there are no entries, return null
if (!iter.hasNext()) return null;
// Concatenate all available addresses, comma separated
String addresses = "";
while (iter.hasNext()) {
addresses += iter.next().getHostAddress();
if (iter.hasNext()) addresses += "\n";
}
return addresses;
}
Formateur.formatIpAddress(int) est obsolète:
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ipAddress = BigInteger.valueOf(wm.getDhcpInfo().netmask).toString();