獲取本機(jī)IPv4地址可分兩種情況眼坏,一種是WiFi已開(kāi)啟菇肃,一種是蜂窩移動(dòng)數(shù)據(jù)已開(kāi)啟。
1取募、WiFi已開(kāi)啟
WiFi開(kāi)啟的情況下琐谤,通過(guò)WiFi獲取本機(jī)IP地址,如果僅僅打開(kāi)WiFi玩敏,但并未接入網(wǎng)絡(luò)斗忌,則IP地址可認(rèn)為是0.0.0.0
质礼。
如果已經(jīng)接入網(wǎng)絡(luò),則可以通過(guò)如下方式獲取IPv4地址织阳。
// 獲取WiFi服務(wù)
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
// 判斷WiFi是否開(kāi)啟
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ip = (ipAddress & 0xFF) + "." +
((ipAddress >> 8) & 0xFF) + "." +
((ipAddress >> 16) & 0xFF) + "." +
(ipAddress >> 24 & 0xFF);
2眶蕉、蜂窩移動(dòng)數(shù)據(jù)已開(kāi)啟
蜂窩移動(dòng)數(shù)據(jù)開(kāi)啟的情況下可以通過(guò)如下方式獲取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唧躲、封裝為工具類
可以將以上兩種方式封裝為一個(gè)工具類IPUtils
造挽,由工具類自動(dòng)判斷網(wǎng)絡(luò)類型并調(diào)用相應(yīng)的方法,最終返回一個(gè)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;
/**
* =======================================================
* 版權(quán):Copyright LiYing 2015-2016. All rights reserved.
* 作者:liying - liruoer2008@yeah.net
* 日期:2016/12/19 19:43
* 版本:1.0
* 描述:IP地址工具類
* 備注:
* =======================================================
*/
public class IPUtils {
/**
* 獲取本機(jī)IPv4地址
*
* @param context
* @return 本機(jī)IPv4地址;null:無(wú)網(wǎng)絡(luò)連接
*/
public static String getIpAddress(Context context) {
// 獲取WiFi服務(wù)
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
// 判斷WiFi是否開(kāi)啟
if (wifiManager.isWifiEnabled()) {
// 已經(jīng)開(kāi)啟了WiFi
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ip = intToIp(ipAddress);
return ip;
} else {
// 未開(kāi)啟WiFi
return getIpAddress();
}
}
private static String intToIp(int ipAddress) {
return (ipAddress & 0xFF) + "." +
((ipAddress >> 8) & 0xFF) + "." +
((ipAddress >> 16) & 0xFF) + "." +
(ipAddress >> 24 & 0xFF);
}
/**
* 獲取本機(jī)IPv4地址
*
* @return 本機(jī)IPv4地址肛真;null:無(wú)網(wǎng)絡(luò)連接
*/
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地址的位置調(diào)用IPUtils.getIpAddress(Context context)
即可。
最后蚓让,別忘了在AndroidManifest.xml
文件中聲明需要的權(quán)限乾忱,如下。
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>