Ist es möglich, die IP-Adresse des Geräts mit einem Code zu erhalten?
Antworten
Zu viele Anzeigen?Zitat // IP-Adresse des Geräts abrufen
open fun getLocalIpAddress(): String? {
try {
val en: Enumeration = NetworkInterface.getNetworkInterfaces()
while (en.hasMoreElements()) {
val networkInterface: NetworkInterface = en.nextElement()
val enumerationIpAddress: Enumeration = networkInterface.inetAddresses
while (enumerationIpAddress.hasMoreElements()) {
val inetAddress: InetAddress = enumerationIpAddress.nextElement()
if (!inetAddress.isLoopbackAddress && inetAddress is Inet4Address) {
return inetAddress.getHostAddress()
}
}
}
} catch (ex: SocketException) {
ex.printStackTrace()
}
return null
}
Hier ist die Kotlin-Version von @Nilesh und @anargund
fun getIpAddress(): String {
var ip = ""
try {
val wm = applicationContext.getSystemService(WIFI_SERVICE) as WifiManager
ip = Formatter.formatIpAddress(wm.connectionInfo.ipAddress)
} catch (e: java.lang.Exception) {
}
if (ip.isEmpty()) {
try {
val en = NetworkInterface.getNetworkInterfaces()
while (en.hasMoreElements()) {
val networkInterface = en.nextElement()
val enumIpAddr = networkInterface.inetAddresses
while (enumIpAddr.hasMoreElements()) {
val inetAddress = enumIpAddr.nextElement()
if (!inetAddress.isLoopbackAddress && inetAddress is Inet4Address) {
val host = inetAddress.getHostAddress()
if (host.isNotEmpty()) {
ip = host
break;
}
}
}
}
} catch (e: java.lang.Exception) {
}
}
if (ip.isEmpty())
ip = "127.0.0.1"
return ip
}
Das Kompilieren einiger Ideen, um die WiFi-IP von WifiManager
in einer einfacheren Kotlin-Lösung zu erhalten:
private fun getWifiIp(context: Context): String? {
return context.getSystemService().let {
when {
it == null -> "Kein WiFi verfügbar"
!it.isWifiEnabled -> "WiFi ist deaktiviert"
it.connectionInfo == null -> "WiFi nicht verbunden"
else -> {
val ip = it.connectionInfo.ipAddress
((ip and 0xFF).toString() + "." + (ip shr 8 and 0xFF) + "." + (ip shr 16 and 0xFF) + "." + (ip shr 24 and 0xFF))
}
}
}
}
Alternativ können Sie die IP-Adressen von IP4-Loopback-Geräten über das NetworkInterface
erhalten:
fun getNetworkIp4LoopbackIps(): Map = try {
NetworkInterface.getNetworkInterfaces()
.asSequence()
.associate { it.displayName to it.ip4LoopbackIps() }
.filterValues { it.isNotEmpty() }
} catch (ex: Exception) {
emptyMap()
}
private fun NetworkInterface.ip4LoopbackIps() =
inetAddresses.asSequence()
.filter { !it.isLoopbackAddress && it is Inet4Address }
.map { it.hostAddress }
.filter { it.isNotEmpty() }
.joinToString()
Ich mache kein Android, aber ich würde das auf eine ganz andere Weise angehen.
Sende eine Abfrage an Google, so etwas wie: https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=my%20ip
Und beziehe dich auf das HTML-Feld, in dem die Antwort gepostet wird. Du kannst auch direkt an die Quelle eine Abfrage senden.
Google wird höchstwahrscheinlich länger existieren als deine Anwendung.
Vergiss nicht, es könnte sein, dass dein Nutzer zu diesem Zeitpunkt keine Internetverbindung hat, was würdest du dann tun!
Viel Glück
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/…