我找不到合适的解决方案。下面的代码给出了我的本地IP地址(如果我连接到Wifi,它提供的IP地址如192.168.0.x),但我想要公共IP地址(就像我在google搜索"我的IP&是什么? #34)
public static 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() && inetAddress instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException ex) {
ex.printStackTrace();
}
return null;
}
OR
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
有人可以帮忙吗?谢谢!
答案 0 :(得分:9)
步骤1:创建一个返回请求者IP地址的Web服务
步骤2:从您的应用程序调用该Web服务。
设备不知道其公共IP地址(除非该设备严重配置错误)。
答案 1 :(得分:8)
您可以使用 whatismyip.com
中的WS https://api.whatismyip.com/ip.php:这将仅在简单文本中输出您的IP地址。 (无需输入,输出可选)
您必须是金级会员才能访问API
更新了答案
您可以使用ipify.org
阅读文档here
使用https://api.ipify.org/?format=json WS获取设备公共IP地址。这将以JSON格式输出您的IP地址。
您应该使用ipify,因为:
....................
....................
答案 2 :(得分:1)
我找到了一个简单的解决方案:
public String getExternalIpAddress() throws Exception {
URL whatismyip = new URL("http://checkip.amazonaws.com");
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(
whatismyip.openStream()));
String ip = in.readLine();
return ip;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
请记住,它必须在单独的线程上运行。
答案 3 :(得分:0)
您可以使用一个简单的线程来执行此操作。 您需要在Activity.class文件中创建一个函数,并需要一个以文本形式提供公共IP的网址:“ https://api.ipify.org/。Click to open.
在您的onCreate()函数中添加此函数调用。
getPublicIP();
在您的MainActivity.class中添加此功能。
private void getPublicIP() {
new Thread(new Runnable(){
public void run(){
//TextView t; //to show the result, please declare and find it inside onCreate()
try {
// Create a URL for the desired page
URL url = new URL("https://api.ipify.org/"); //My text file location
//First open the connection
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setConnectTimeout(60000); // timing out in a minute
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
//t=(TextView)findViewById(R.id.TextView1); // ideally do this in onCreate()
String str;
while ((str = in.readLine()) != null) {
urls.add(str);
}
in.close();
} catch (Exception e) {
Log.d("MyTag",e.toString());
}
//since we are in background thread, to post results we have to go back to ui thread. do the following for that
PermissionsActivity.this.runOnUiThread(new Runnable(){
public void run(){
try {
Toast.makeText(PermissionsActivity.this, "Public IP:"+urls.get(0), Toast.LENGTH_SHORT).show();
}
catch (Exception e){
Toast.makeText(PermissionsActivity.this, "TurnOn wiffi to get public ip", Toast.LENGTH_SHORT).show();
}
}
});
}
}).start();
}
答案 4 :(得分:-1)
拨打https://whatismyipaddress.com或http://howtofindmyipaddress.com/等服务器。
如果您有页面源,则解析ip地址。
还有其他服务器只返回您的IP地址。不是上面两个完整的html页面。但我忘了哪一个......