Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何以编程方式获取公共IP地址?_Android_Networking_Ip - Fatal编程技术网

Android 如何以编程方式获取公共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 更新

我没有找到正确的解决办法。下面的代码为我提供了本地IP地址(如果我连接到Wifi,它会提供类似192.168.0.x的IP地址),但我需要公共IP地址(就像我在谷歌搜索“我的IP是什么”)

有人能帮忙吗?谢谢

步骤#1:创建一个返回请求者IP地址的Web服务

第2步:从你的应用程序中调用该Web服务

设备不知道其公共IP地址(除非该设备严重配置错误)。

您可以使用
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();