您的位置:

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 地址