在Android开发中,有时需要获取设备的MAC地址以用于唯一标识设备或其他目的。以下是两种有效的获取方法:
### 方法一:通过Wi-Fi连接获取MAC地址
此方法适用于设备已开启Wi-Fi连接的情况。通过Wi-Fi管理器可以轻松访问MAC地址和IP地址。如果未开启Wi-Fi,则无法获取MAC地址。
public static void getLocalMacAddressFromWifiInfo(Context context) {
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
String macAddress = info.getMacAddress(); // 获取MAC地址
int ipAddress = info.getIpAddress(); // 获取IP地址
String ip = intToIp(ipAddress);
}
public String intToIp(int i) {
return ((i >> 24) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + (i & 0xFF);
}
请注意,此方法需要添加相应的权限。
### 方法二:通过网络接口获取MAC地址
这种方法无需开启Wi-Fi,而是利用Android的API `NetworkInterface.getHardwareAddress()` 来获取本地IP地址和MAC地址。首先,获取本地IP地址:
public static String getLocalIpAddress() {
try {
for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
Log.e("WifiPreference IpAddress", ex.toString());
}
return null;
}
接着,根据获取到的IP地址来获取MAC地址:
public static String getLocalMacAddressFromIp(Context context) {
String mac_s = "";
try {
byte[] mac;
NetworkInterface ne = NetworkInterface.getByInetAddress(InetAddress.getByName(getLocalIpAddress()));
mac = ne.getHardwareAddress();
mac_s = byte2hex(mac);
} catch (Exception e) {
e.printStackTrace();
}
return mac_s;
}
将字节数组转换为十六进制字符串的方法如下:
public static String byte2hex(byte[] b) {
StringBuffer hs = new StringBuffer(b.length);
String stmp = "";
int len = b.length;
for (int n = 0; n stmp = Integer.toHexString(b[n] & 0xFF);
if (stmp.length() == 1) {
hs = hs.append("0").append(stmp);
} else {
hs = hs.append(stmp);
}
}
return String.valueOf(hs);
}
对于获取IP地址的方法,还有一种改进方式,可以确保返回的是IPv4地址。具体实现如下:
public String getLocalIpAddress() {
try {
String ipv4;
List nilist = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface ni : nilist) {
List ialist = Collections.list(ni.getInetAddresses());
for (InetAddress address : ialist) {
if (!address.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4 = address.getHostAddress())) {
return ipv4;
}
}
}
} catch (SocketException ex) {
Log.e(LOG_TAG, ex.toString());
}
return null;
}
以上方法可以帮助开发者在不同场景下获取Android设备的MAC地址,提高应用的灵活性和兼容性。