Ist es möglich, die IP-Adresse des Geräts mit einem Code zu erhalten?
Antworten
Zu viele Anzeigen?Verwenden Sie einfach Volley, um die IP von dieser Seite zu erhalten
RequestQueue queue = Volley.newRequestQueue(this);
String urlip = "http://checkip.amazonaws.com/";
StringRequest stringRequest = new StringRequest(Request.Method.GET, urlip, new Response.Listener() {
@Override
public void onResponse(String response) {
txtIP.setText(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
txtIP.setText("hat nicht funktioniert");
}
});
queue.add(stringRequest);
In Kotlin, ohne Formatter
private fun getIPAddress(useIPv4 : Boolean): String {
try {
var interfaces = Collections.list(NetworkInterface.getNetworkInterfaces())
for (intf in interfaces) {
var addrs = Collections.list(intf.getInetAddresses());
for (addr in addrs) {
if (!addr.isLoopbackAddress()) {
var sAddr = addr.getHostAddress();
var isIPv4: Boolean
isIPv4 = sAddr.indexOf(':')<0
if (useIPv4) {
if (isIPv4)
return sAddr;
} else {
if (!isIPv4) {
var delim = sAddr.indexOf('%') // ip6-Zonen-Suffix entfernen
if (delim < 0) {
return sAddr.toUpperCase()
}
else {
return sAddr.substring(0, delim).toUpperCase()
}
}
}
}
}
}
} catch (e: java.lang.Exception) { }
return ""
}
Kürzlich wurde trotz fehlender Netzwerkverbindung (kein Servicestatus) immer noch eine IP-Adresse von getLocalIpAddress()
zurückgegeben. Das bedeutet, die im Menü Einstellungen> Über das Telefon> Status angezeigte IP-Adresse war anders als von der Anwendung angenommen.
Ich habe einen Workaround implementiert, indem ich diesen Code hinzugefügt habe:
ConnectivityManager cm = getConnectivityManager();
NetworkInfo net = cm.getActiveNetworkInfo();
if ((null == net) || !net.isConnectedOrConnecting()) {
return null;
}
Klang das für jemanden vertraut?
Ein Gerät kann mehrere IP-Adressen haben, und diejenige, die in einer bestimmten App verwendet wird, muss nicht die IP sein, die die Server, die die Anfrage erhalten, sehen werden. Tatsächlich nutzen einige Benutzer ein VPN oder einen Proxy wie Cloudflare Warp.
Wenn Ihr Ziel darin besteht, die IP-Adresse zu erhalten, die von den Servern angezeigt wird, die Anfragen von Ihrem Gerät erhalten, dann ist es am besten, einen IP-Geolokalisierungsdienst wie Ipregistry (Haftungsausschluss: Ich arbeite für das Unternehmen) mit seinem Java-Client abzufragen:
https://github.com/ipregistry/ipregistry-java
IpregistryClient client = new IpregistryClient("tryout");
RequesterIpInfo requesterIpInfo = client.lookup();
requesterIpInfo.getIp();
Zusätzlich zu seiner einfachen Anwendung erhalten Sie weitere Informationen wie Land, Sprache, Währung, die Zeitzone für die Geräte-IP und können feststellen, ob der Benutzer einen Proxy verwendet.
Dies ist der einfachste und einfachste Weg, der jemals im Internet existiert hat... Zuerst fügen Sie diese Berechtigung Ihrer Manifestdatei hinzu...
-
"INTERNET"
-
"ACCESS_NETWORK_STATE"
Fügen Sie dies in die onCreate-Datei der Aktivität ein...
getPublicIP();
Fügen Sie jetzt diese Funktion Ihrer MainActivity.class hinzu.
private void getPublicIP() {
ArrayList urls=new ArrayList(); //um jede Zeile zu lesen
new Thread(new Runnable(){
public void run(){
//TextView t; //um das Ergebnis anzuzeigen, bitte deklarieren und in onCreate finden()
try {
// Erstelle eine URL für die gewünschte Seite
URL url = new URL("https://api.ipify.org/"); //Mein Textdatei-Standort
// Öffne zuerst die Verbindung
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setConnectTimeout(60000); // Time-out nach einer Minute
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
//t=(TextView)findViewById(R.id.TextView1); // idealerweise in onCreate()
String str;
while ((str = in.readLine()) != null) {
urls.add(str);
}
in.close();
} catch (Exception e) {
Log.d("MyTag",e.toString());
}
//Da wir uns im Hintergrundthread befinden, müssen wir zur Anzeige der Ergebnisse zum UI-Thread zurückkehren. Führen Sie dazu folgendes aus
PermissionsActivity.this.runOnUiThread(new Runnable(){
public void run(){
try {
Toast.makeText(PermissionsActivity.this, "Öffentliche IP:"+urls.get(0), Toast.LENGTH_SHORT).show();
}
catch (Exception e){
Toast.makeText(PermissionsActivity.this, "Schalten Sie das WLAN ein, um die öffentliche IP zu erhalten", Toast.LENGTH_SHORT).show();
}
}
});
}
}).start();
}
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/…