獲取本機IPv4地址可分兩種情況,一種是WiFi已開啟,一種是蜂窩移動數據已開啟。
1、WiFi已開啟
WiFi開啟的情況下,通過WiFi獲取本機IP地址,如果僅僅打開WiFi,但並未接入網絡,則IP地址可認為是0.0.0.0
。
如果已經接入網絡,則可以通過如下方式獲取IPv4地址。
// 獲取WiFi服務
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
// 判斷WiFi是否開啟
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ip = (ipAddress & 0xFF) + "." +
((ipAddress >> 8) & 0xFF) + "." +
((ipAddress >> 16) & 0xFF) + "." +
(ipAddress >> 24 & 0xFF);
2、蜂窩移動數據已開啟
蜂窩移動數據開啟的情況下可以通過如下方式獲取IPv4地址。
try {
NetworkInterface networkInterface;
InetAddress inetAddress;
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
networkInterface = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = networkInterface.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) {
String ip = inetAddress.getHostAddress();
}
}
}
} catch (SocketException ex) {
ex.printStackTrace();
}
3、封裝為工具類
可以將以上兩種方式封裝為一個工具類IPUtils
,由工具類自動判斷網絡類型並調用相應的方法,最終返回一個IPv4地址。
完整代碼如下所示。
- IPUtils.java
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
/**
* =======================================================
* 版權:Copyright LiYing 2015-2016. All rights reserved.
* 作者:liying - liruoer2008@yeah.net
* 日期:2016/12/19 19:43
* 版本:1.0
* 描述:IP地址工具類
* 備注:
* =======================================================
*/
public class IPUtils {
/**
* 獲取本機IPv4地址
*
* @param context
* @return 本機IPv4地址;null:無網絡連接
*/
public static String getIpAddress(Context context) {
// 獲取WiFi服務
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
// 判斷WiFi是否開啟
if (wifiManager.isWifiEnabled()) {
// 已經開啟了WiFi
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ip = intToIp(ipAddress);
return ip;
} else {
// 未開啟WiFi
return getIpAddress();
}
}
private static String intToIp(int ipAddress) {
return (ipAddress & 0xFF) + "." +
((ipAddress >> 8) & 0xFF) + "." +
((ipAddress >> 16) & 0xFF) + "." +
(ipAddress >> 24 & 0xFF);
}
/**
* 獲取本機IPv4地址
*
* @return 本機IPv4地址;null:無網絡連接
*/
private static String getIpAddress() {
try {
NetworkInterface networkInterface;
InetAddress inetAddress;
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
networkInterface = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = networkInterface.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) {
return inetAddress.getHostAddress();
}
}
}
return null;
} catch (SocketException ex) {
ex.printStackTrace();
return null;
}
}
}
之后,只需要在需要得到IPv4地址的位置調用IPUtils.getIpAddress(Context context)
即可。
最后,別忘了在AndroidManifest.xml
文件中聲明需要的權限,如下。
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>