在 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 地址
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/154413.html