Android 如何以编程方式获取公共IP地址?
我没有找到正确的解决办法。下面的代码为我提供了本地IP地址(如果我连接到Wifi,它会提供类似192.168.0.x的IP地址),但我需要公共IP地址(就像我在谷歌搜索“我的IP是什么”) 有人能帮忙吗?谢谢 步骤#1:创建一个返回请求者IP地址的Web服务 第2步:从你的应用程序中调用该Web服务 设备不知道其公共IP地址(除非该设备严重配置错误)。您可以使用Android 如何以编程方式获取公共IP地址?,android,networking,ip,Android,Networking,Ip,我没有找到正确的解决办法。下面的代码为我提供了本地IP地址(如果我连接到Wifi,它会提供类似192.168.0.x的IP地址),但我需要公共IP地址(就像我在谷歌搜索“我的IP是什么”) 有人能帮忙吗?谢谢 步骤#1:创建一个返回请求者IP地址的Web服务 第2步:从你的应用程序中调用该Web服务 设备不知道其公共IP地址(除非该设备严重配置错误)。您可以使用whatismyip.com中的WS:这将仅在简单文本中输出您的IP地址。(无需输入,输出为可选) 您必须是金牌会员才能访问API 更新
whatismyip.com
中的WS:这将仅在简单文本中输出您的IP地址。(无需输入,输出为可选)
您必须是金牌会员才能访问API
更新的答案
您可以从ipify.org
通读文档
使用WS获取设备公共IP地址。这将以JSON格式输出您的IP地址
您应该使用ipify,因为:
- 您可以无限制地使用它(即使您每分钟处理数百万个请求)
- 它始终在线且可用,其基础设施由Heroku提供动力,这意味着无论运行API的服务器是否死亡,或者如果有毁灭东海岸一半的巨大龙卷风,ipify仍将运行李>
- 它可以完美地处理IPv4和IPv6地址,因此无论您使用哪种技术,都不会出现问题
打电话给服务器,如或 如果您有页面源,则解析出ip地址
其他服务器只返回您的ip地址。不是像上面两个那样的整个html页面。但我忘了是哪一个…我找到了这个简单的解决方案:
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();
}
}
}
}
请记住,这必须在单独的线程上运行。您可以用一个简单的线程来完成。 您需要在Activity.class文件中创建一个函数,并需要请求一个url,该url将以文本形式提供您的公共IP:” 在onCreate()函数中添加此函数调用 在MainActivity.class中添加此函数
private void getPublicIP(){
新线程(newrunnable()){
公开募捐{
//TextView t;//要显示结果,请声明并在onCreate()中找到它
试一试{
//为所需页面创建URL
URL=新URL(“https://api.ipify.org/“”;//我的文本文件位置
//首先打开连接
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setConnectTimeout(60000);//一分钟后超时
BufferedReader in=新的BufferedReader(新的InputStreamReader(conn.getInputStream());
//t=(TextView)findViewById(R.id.TextView1);//理想情况下在onCreate()中执行此操作
字符串str;
而((str=in.readLine())!=null){
url.add(str);
}
in.close();
}捕获(例外e){
Log.d(“MyTag”,例如toString());
}
//因为我们在后台线程中,所以要发布结果,我们必须返回ui线程
PermissionsActivity.this.runOnUiThread(新的Runnable(){
公开募捐{
试一试{
Toast.makeText(PermissionsActivity.this,“公共IP:+url.get(0),Toast.LENGTH_SHORT.show();
}
捕获(例外e){
Toast.makeText(PermissionsActivity.this,“打开wiffi获取公共ip”,Toast.LENGTH_SHORT.show();
}
}
});
}
}).start();
}
可能重复的使用http://api.whatismyip.com/ip.php WS-to-get-device-public-IP address
不起作用。您在发布之前尝试过吗?您必须是黄金级别的成员才能访问API。您是WhatIsMyIP.com的黄金级别成员吗?在需要成为成员的地方使用服务器没有多大意义。为什么不尝试呢你马上告诉我?它们已经有几十年了。就像你提到的那样。没有区别。确保你的隐私政策指出你是在向其他人的Web服务而不是你自己的Web服务提出这些请求。确保你的隐私政策指出你是在向其他人的Web服务提出这些请求,而不是n一个你自己的。其他的答案让我发疯。非常感谢!在线提供的很棒的解决方案:)使用此api有最大限制吗?
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
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();
}
}
}
}
getPublicIP();