Ist es möglich, die IP-Adresse des Geräts mit einem Code zu erhalten?
Antworten
Zu viele Anzeigen?Sie können LinkProperties verwenden. Es wird für neue Android-Versionen empfohlen.
Diese Funktion ruft die lokale IP-Adresse sowohl für WiFi als auch für mobile Daten ab. Sie erfordert die Berechtigung Manifest.permission.ACCESS_NETWORK_STATE
.
@Nullable
public static String getDeviceIpAddress(@NonNull ConnectivityManager connectivityManager) {
LinkProperties linkProperties = connectivityManager.getLinkProperties(connectivityManager.getActiveNetwork());
InetAddress inetAddress;
for(LinkAddress linkAddress : linkProperties.getLinkAddresses()) {
inetAddress = linkAddress.getAddress();
if (inetAddress instanceof Inet4Address
&& !inetAddress.isLoopbackAddress()
&& inetAddress.isSiteLocalAddress()) {
return inetAddress.getHostAddress();
}
}
return null;
}
In Ihrer Aktivität gibt die folgende Funktion getIpAddress(context)
die IP-Adresse des Telefons zurück:
public static String getIpAddress(Context context) {
WifiManager wifiManager = (WifiManager) context.getApplicationContext()
.getSystemService(WIFI_SERVICE);
String ipAddress = intToInetAddress(wifiManager.getDhcpInfo().ipAddress).toString();
ipAddress = ipAddress.substring(1);
return ipAddress;
}
public static InetAddress intToInetAddress(int hostAddress) {
byte[] addressBytes = { (byte)(0xff & hostAddress),
(byte)(0xff & (hostAddress >> 8)),
(byte)(0xff & (hostAddress >> 16)),
(byte)(0xff & (hostAddress >> 24)) };
try {
return InetAddress.getByAddress(addressBytes);
} catch (UnknownHostException e) {
throw new AssertionError();
}
}
Dies ist eine Überarbeitung von dieser Antwort, bei der irrelevante Informationen entfernt, hilfreiche Kommentare hinzugefügt, Variablen klar benannt und die Logik verbessert wurden.
Vergessen Sie nicht, die folgenden Berechtigungen einzuschließen:
InternetHelper.java:
public class InternetHelper {
/**
* IP-Adresse von der ersten nicht-lokalen Schnittstelle abrufen
*
* @param useIPv4 true=ipv4 zurückgeben, false=ipv6 zurückgeben
* @return Adresse oder leerer String
*/
public static String getIPAddress(boolean useIPv4) {
try {
List interfaces =
Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface interface_ : interfaces) {
for (InetAddress inetAddress :
Collections.list(interface_.getInetAddresses())) {
/* Eine Loopback-Adresse wäre etwas wie 127.0.0.1 (das Gerät selbst). Wir möchten die erste nicht-Loopback-Adresse zurückgeben. */
if (!inetAddress.isLoopbackAddress()) {
String ipAddr = inetAddress.getHostAddress();
boolean isIPv4 = ipAddr.indexOf(':') < 0;
if (isIPv4 && !useIPv4) {
continue;
}
if (useIPv4 && !isIPv4) {
int delim = ipAddr.indexOf('%'); // ip6-Zonen-Suffix abwerfen
ipAddr = delim < 0 ? ipAddr.toUpperCase() :
ipAddr.substring(0, delim).toUpperCase();
}
return ipAddr;
}
}
}
} catch (Exception ignored) { } // Wenn keine Verbindung hergestellt werden kann, einfach leeren String zurückgeben
return "";
}
/**
* IPv4-Adresse von der ersten nicht-lokalen Schnittstelle abrufen
*
* @return Adresse oder leerer String
*/
public static String getIPAddress() {
return getIPAddress(true);
}
}
public static String getDeviceIpAddress() {
try {
for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException ex) {
ex.printStackTrace();
}
return null;
}
6 Stimmen
Vergessen Sie nicht, dass dies eine Sammlung der Größe N ist, und Sie können nicht davon ausgehen, dass N == ( 0 || 1 ). Mit anderen Worten, nehmen Sie nicht an, dass ein Gerät nur eine Möglichkeit hat, mit einem Netzwerk zu kommunizieren, und nehmen Sie nicht an, dass es überhaupt eine Möglichkeit zum Kommunizieren mit einem Netzwerk hat.
0 Stimmen
Verwandte: stackoverflow.com/questions/9481865/…
2 Stimmen
Nicht programmatische Version android.stackexchange.com/questions/2984/…
0 Stimmen
Du solltest es von einem externen Dienst bekommen ipof.in/txt ist ein solcher Dienst.
0 Stimmen
Ist es möglich, dies programmgesteuert in Android zu erhalten?
0 Stimmen
Siehe meine Antwort unter stackoverflow.com/questions/16730711/…