在 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 地址:
- 打开 Android 系统设置
- 进入“关于手机”或“设备信息”
- 查看“状态”或“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 地址