Android获取IP地址详解

在 Android 开发中,获取设备 IP 地址是一项非常常见的任务。Android 操作系统提供了多种方式来获取设备的 IP 地址,本文将介绍其中一些方法。

一、Android 获取 IP 地址权限

在 Android 中获取 IP 地址时,需要获取以下权限:


<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

二、Android 获取 IP 地址

在 Android 中获取 IP 地址的方法主要有两种:

1. 使用 NetworkInterface 获取 IP 地址

可以通过 NetworkInterface 来获取设备的所有网络接口,然后遍历每个网络接口的所有地址,查找 IPv4 类型的地址即可获取到设备的 IP 地址。


public static String getIPAddress() {
    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() && addr instanceof Inet4Address) {
                    return addr.getHostAddress();
                }
            }
        }
    } catch (Exception e) {
        Log.e("getIPAddress", e.toString());
    }
    return "";
} 

  • 该方法返回设备的 IPv4 地址
  • 如果设备没有网络连接,该方法将返回空字符串
  • 该方法需要在 AndroidManifest.xml 中声明上述两个权限

2. 使用 WifiManager 获取 IP 地址

可以通过 WifiManager 来获取设备当前连接的 Wifi 路由器的 IP 地址。


public static String getWifiIPAddress(Context context) {
    WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
    int ipAddress = wifiInfo.getIpAddress();
    return Formatter.formatIpAddress(ipAddress);
} 

  • 该方法返回当前连接的 Wifi 路由器的IPv4地址
  • 如果设备没有连接 Wifi,该方法将返回 “0.0.0.0”
  • 该方法需要在 AndroidManifest.xml 中声明上述两个权限

三、Android 查看 IP 地址

可以通过 Android 系统提供的设置界面来查看当前设备的 IP 地址:

  1. 打开 Android 系统设置
  2. 进入“关于手机”或“设备信息”
  3. 查看“状态”或“Wi-Fi状态”,可以看到 “IP 地址” 的信息

四、获取 IP 地址的 DNS

DNS 是通过域名查找 IP 地址的一种服务,可以通过以下方法来查看 DNS:


public static List<String> getDNS(Context context) {
    List<String> dnsList = new ArrayList<String>();
    WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    DhcpInfo dhcpInfo = wifiMgr.getDhcpInfo();
    int dns1 = dhcpInfo.dns1;
    int dns2 = dhcpInfo.dns2;
    dnsList.add(Formatter.formatIpAddress(dns1));
    dnsList.add(Formatter.formatIpAddress(dns2));
    return dnsList;
} 

五、Android 设置 IP 地址

在 Android 中,可以通过以下代码来设置设备的静态 IP 地址:


private void setStaticIpAddress(String ip, String gateway, String netmask, String dns1, String dns2) {
    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    WifiConfiguration wifiConfig = null;
    WifiInfo connectionInfo = wifiManager.getConnectionInfo();
    List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
    if (configuredNetworks != null) {
        String ssid = connectionInfo.getSSID();
        for (WifiConfiguration conf : configuredNetworks) {
            if (ssid.equals(conf.SSID)) {
                wifiConfig = conf;
                break;
            }
        }
        if (wifiConfig != null) {
            try {
                setIpAssignment("STATIC", wifiConfig);
                setIpAddress(InetAddress.getByName(ip), Integer.parseInt(netmask), wifiConfig);
                setGateway(InetAddress.getByName(gateway), wifiConfig);
                setDNS(InetAddress.getByName(dns1), InetAddress.getByName(dns2), wifiConfig);
                wifiManager.updateNetwork(wifiConfig);
                wifiManager.enableNetwork(wifiConfig.networkId, true);
                wifiManager.reconnect();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

private void setIpAssignment(String assign, WifiConfiguration wifiConf) throws Exception {
    WifiConfiguration.IpAssignment ipAssignment = WifiConfiguration.IpAssignment.valueOf(assign);
    wifiConf.ipAssignment = ipAssignment;
    Method setIpAssignment = WifiConfiguration.class.getMethod("setIpAssignment", WifiConfiguration.IpAssignment.class);
    setIpAssignment.invoke(wifiConf, ipAssignment);
}

private void setIpAddress(InetAddress addr, int prefixLength, WifiConfiguration wifiConf) throws Exception {
    Method setIpAddress = WifiConfiguration.class.getMethod("setIpAddress", InetAddress.class, int.class);
    setIpAddress.invoke(wifiConf, addr, prefixLength);
}

private void setGateway(InetAddress gateway, WifiConfiguration wifiConf) throws Exception {
    Method setGateway = WifiConfiguration.class.getMethod("setGateway", InetAddress.class);
    setGateway.invoke(wifiConf, gateway);
}

private void setDNS(InetAddress dns1, InetAddress dns2, WifiConfiguration wifiConf) throws Exception {
    List<InetAddress> dnsList = new ArrayList<InetAddress>();
    dnsList.add(dns1);
    dnsList.add(dns2);
    Method setDns = WifiConfiguration.class.getMethod("setDnsServers", List.class);
    setDns.invoke(wifiConf, dnsList);
}

  • 该方法可以设置设备的静态 IP 地址,网关,子网掩码和 DNS
  • 该方法需要在 AndroidManifest.xml 中声明上述两个权限

六、Android 获取 DNS

可以通过以下代码获取设备的 DNS:


public static List<String> getDNS(Context context) {
    List<String> dnsList = new ArrayList<String>();
    WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    DhcpInfo dhcpInfo = wifiMgr.getDhcpInfo();
    int dns1 = dhcpInfo.dns1;
    int dns2 = dhcpInfo.dns2;
    dnsList.add(Formatter.formatIpAddress(dns1));
    dnsList.add(Formatter.formatIpAddress(dns2));
    return dnsList;
} 

  • 该方法返回当前连接的 Wifi 路由器的 DNS 列表
  • 如果设备没有连接 Wifi,该方法将返回空列表
  • 该方法需要在 AndroidManifest.xml 中声明上述两个权限

七、Android 获取公网 IP

获取设备的公网 IP 地址并不是一个简单的任务,需要借助第三方服务。下面是一个简单的获取公网 IP 的示例。


public static String getPublicIPAddress() {
    String ipAddress = "";
    try {
        URL url = new URL("http://checkip.amazonaws.com");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setConnectTimeout(5000);
        con.setReadTimeout(5000);
        con.setRequestMethod("GET");
        InputStream in = new BufferedInputStream(con.getInputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        ipAddress = reader.readLine();
        reader.close();
        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ipAddress;
} 

  • 该方法返回设备的公网 IP 地址
  • 需要借助 http://checkip.amazonaws.com 来获取公网 IP 地址,也可以通过其他类似的第三方服务获取公网 IP 地址

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/154413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-16 14:12
下一篇 2024-11-16 14:12

相关推荐

  • cmd看地址

    本文将从多个方面详细阐述cmd看地址,包括如何查看本机IP地址、如何查看路由器IP、如何查看DNS服务器IP等等。 一、查看本机IP地址 要查看本机IP地址,首先需要打开cmd窗口…

    编程 2025-04-29
  • 尚硅谷官网地址用法介绍

    尚硅谷是国内一家领先的技术培训机构,提供了众多IT职业的培训,包括Java、Python、大数据、前端、人工智能等方向。其官网地址为http://www.atguigu.com/。…

    编程 2025-04-29
  • Centos7配置静态ip

    本文将详细阐述如何在Centos7系统中配置静态ip。 一、查看网络接口 在配置静态ip之前,我们首先需要查看系统中的网络接口,以确定我们需要配置的网卡是哪一个。 ifconfig…

    编程 2025-04-29
  • Python检测IP连通

    Python是一门强大的编程语言,常用于网络开发、数据分析等领域。IP地址是网络通信的基础,在网络通信中,有时需要检测IP地址是否连通。下面将从多个方面介绍Python检测IP连通…

    编程 2025-04-28
  • Android ViewPager和ScrollView滑动冲突问题

    Android开发中,ViewPager和ScrollView是两个常用的控件。但是当它们同时使用时,可能会发生滑动冲突的问题。本文将从多个方面介绍解决Android ViewPa…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28
  • Idea2022变更Git地址

    本文将从以下几个方面对Idea2022变更Git地址进行详细阐述: 一、GitHub上修改Git仓库地址 1、登录GitHub,找到需要修改的Git仓库 2、在代码页面点击右上角的…

    编程 2025-04-28
  • Treck TCP/IP Stack 输入验证错误漏洞CVE-2020-11901解析

    本文将对Treck TCP/IP Stack 输入验证错误漏洞CVE-2020-11901进行详细解析,并提供相关代码示例。 一、漏洞背景 Treck TCP/IP Stack是一…

    编程 2025-04-27
  • electron-egg打包后请求地址错误解决方法用法介绍

    本文将从多个方面对electron-egg打包后请求地址错误进行详细阐述,并给出解决方法。 一、electron-egg打包后请求地址错误的表现 在使用 electron-egg …

    编程 2025-04-27
  • PHP获取301跳转后的地址

    本文将为大家介绍如何使用PHP获取301跳转后的地址。301重定向是什么呢?当我们访问一个网页A,但是它已经被迁移到了另一个地址B,此时若服务器端做了301重定向,那么你的浏览器在…

    编程 2025-04-27

发表回复

登录后才能评论