如何以编程方式获取公共IP地址?

时间:2017-12-14 11:59:58

标签: android networking ip

我找不到合适的解决方案。下面的代码给出了我的本地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());

有人可以帮忙吗?谢谢!

5 个答案:

答案 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,因为:

  • 您可以无限制地使用它(即使您每分钟要做数百万次请求)。
  • 它始终在线且可用,其基础设施由Heroku提供支持,这意味着无论运行API的服务器是否死亡,或者是否有巨大的龙卷风摧毁了东海岸的一半,ipify仍将运行!
  • 它与IPv4和IPv6地址完美配合,因此无论您使用何种技术,都不会出现问题。

....................

....................

答案 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.comhttp://howtofindmyipaddress.com/等服务器。

如果您有页面源,则解析ip地址。

还有其他服务器只返回您的IP地址。不是上面两个完整的html页面。但我忘了哪一个......