【问题标题】:How to get Public IP address of Android device programmatically?如何以编程方式获取 Android 设备的公共 IP 地址?
【发布时间】:2020-05-06 04:52:32
【问题描述】:

我想检索 publick IP 地址,例如我们从 whatismyipaddress.com 获得的地址,我不想使用任何第三方服务 https://www.ipify.org。有什么方法可以从 Android 的内置类或库中获取此 IP 地址。

如果无法从 Android 库中获取所需的数据,请建议任何逻辑以在服务器级别获取相同的数据,而不是在客户端级别获取。注意:负载均衡器在路由到实际 Web 应用程序之前存在

【问题讨论】:

标签: android ip-address


【解决方案1】:

使用此方法获取您的 IpAddress

public static String getIPAddress(boolean useIPv4) {
        try {
            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface intf : interfaces) {
                List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
                for (InetAddress addr : addrs) {
                    if (!addr.isLoopbackAddress()) {
                        String sAddr = addr.getHostAddress();

                        boolean isIPv4 = sAddr.indexOf(':')<0;

                        if (useIPv4) {
                            if (isIPv4) 
                                return sAddr;
                        } else {
                            if (!isIPv4) {
                                int delim = sAddr.indexOf('%'); 
                                return delim<0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase();
                            }
                        }
                    }
                }
            }
        } catch (Exception ignored) { } 
        return "";
    }

【讨论】:

  • 感谢您的建议,建议的逻辑是返回私有 IP 地址,例如 192.168.*.* 。但我正在寻找公共 IP 地址。
【解决方案2】:

我在我的项目中使用这种方法..所以你可以使用它..它会返回你的设备 IP

private String getIpAddress() {
    String ip = "";
    try {
        Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
                .getNetworkInterfaces();
        while (enumNetworkInterfaces.hasMoreElements()) {
            NetworkInterface networkInterface = enumNetworkInterfaces
                    .nextElement();
            Enumeration<InetAddress> enumInetAddress = networkInterface
                    .getInetAddresses();
            while (enumInetAddress.hasMoreElements()) {
                InetAddress inetAddress = enumInetAddress.nextElement();

                if (inetAddress.isSiteLocalAddress()) {
                    ip += inetAddress.getHostAddress();
                }

            }

        }

    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        ip += "Something Wrong! " + e.toString() + "\n";
    }

    return ip;
}

如果您想获取您的设备连接的网络的公共 IP,请使用此代码...

public class GetPublicIP extends AsyncTask<String, String, String>{

    @Override
    protected String doInBackground(String... strings) {
        String publicIP = "";
        try  {
            java.util.Scanner s = new java.util.Scanner(
                    new java.net.URL(
                            "https://api.ipify.org")
                            .openStream(), "UTF-8")
                    .useDelimiter("\\A");
            publicIP = s.next();
            System.out.println("My current IP address is " + publicIP);
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }

        return publicIP;
    }

    @Override
    protected void onPostExecute(String publicIp) {
        super.onPostExecute(publicIp);

        Log.e("PublicIP", publicIp+"");
        //Here 'publicIp' is your desire public IP
    }
}

新的执行它

new GetPublicIP().execute();

【讨论】:

  • 感谢您的建议,建议的逻辑是返回设备 IP 地址,例如 100.81.*.* 。但我正在寻找公共 IP 地址。
  • 公共地址是什么?安卓设备?
  • Android 设备使用的网络连接的公共 IP,通常在 whatismyipaddress.com、ipify.org 等上获取。我的 IP 地址是:IPv4:223.*.*.* IPv6:未检测到我的 IP 信息:ISP:Bharti Airtel 城市:维沙卡帕特南地区:安得拉邦国家:印度
  • 100.0 当然也是一个公共范围。只需禁用移动数据并使用 WiFi。
  • 我的意思是@Mahesh ...可能有两个公共IP,因此它是两个接口。根据用于 HTTP 请求的接口,结果可能会有所不同(WiFi 优于 UMTS)。
猜你喜欢
  • 2018-05-28
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2015-02-26
  • 2013-01-27
  • 1970-01-01
相关资源
最近更新 更多