Как получить недостающий MAC-адрес Wifi в Android Marshmallow и позже?
Разработчики Android, желающие получить MAC-адрес Wifi на Android M, возможно, столкнулись с проблемой, когда стандартный API Android OS для получения MAC-адреса возвращает поддельный MAC-адрес (02: 00: 00: 00: 00: 00) от реальной величины.
Обычный способ получить MAC-адрес Wifi ниже:
final WifiManager wifiManager = (WifiManager) getApplication().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
final String wifiMACaddress = wifiManager.getConnectionInfo().getMacAddress();
Ответы
Ответ 1
В Android M MACAddress будет "нечитабельно" для Wi-Fi и Bluetooth.
Вы можете получить MACAddress WiFi с (Android M Preview 2):
public static String getWifiMacAddress() {
try {
String interfaceName = "wlan0";
List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface intf : interfaces) {
if (!intf.getName().equalsIgnoreCase(interfaceName)){
continue;
}
byte[] mac = intf.getHardwareAddress();
if (mac==null){
return "";
}
StringBuilder buf = new StringBuilder();
for (byte aMac : mac) {
buf.append(String.format("%02X:", aMac));
}
if (buf.length()>0) {
buf.deleteCharAt(buf.length() - 1);
}
return buf.toString();
}
} catch (Exception ex) { } // for now eat exceptions
return "";
}
(получил этот код из Сообщение)
Как-то я слышал, что чтение файла из "/sys/class/net/" + networkInterfaceName + "/address"; не будет работать, так как Android N будет выпущен, а также могут быть различия между разными производителями, такими как Samsung и т.д.
Надеюсь, этот код по-прежнему будет работать в более поздних версиях Android.
EDIT: Также в версии Android 6 это работает
Ответ 2
Решено!
MAC-адрес все еще может быть схвачен с пути:
"/sys/class/net/" + networkInterfaceName + "/address";
Просто прочитайте файл, или кошка этого файла покажет MAC-адрес Wifi.
Имена сетевых интерфейсов обычно расположены вдоль линий "wlan0" или "eth1"
Ответ 3
Вы можете получить MAC-адрес с локального адреса IPv6. Например, адрес IPv6 "fe80:: 1034: 56ff: fe78: 9abc" соответствует MAC-адресу "12-34-56-78-9a-bc". См. Код ниже. Для получения IP-адреса WiFi требуется только андроид .permission.INTERNET.
Смотрите страницу Википедии IPv6 Address, в частности заметку о "локальных адресах" fe80::/64 и раздел "Модифицированный EUI- 64".
/**
* Gets an EUI-48 MAC address from an IPv6 link-local address.
* E.g., the IPv6 address "fe80::1034:56ff:fe78:9abc"
* corresponds to the MAC address "12-34-56-78-9a-bc".
* <p/>
* See the note about "local addresses" fe80::/64 and the section about "Modified EUI-64" in
* the Wikipedia article "IPv6 address" at https://en.wikipedia.org/wiki/IPv6_address
*
* @param ipv6 An Inet6Address object.
* @return The EUI-48 MAC address as a byte array, null on error.
*/
private static byte[] getMacAddressFromIpv6(final Inet6Address ipv6)
{
byte[] eui48mac = null;
if (ipv6 != null) {
/*
* Make sure that this is an fe80::/64 link-local address.
*/
final byte[] ipv6Bytes = ipv6.getAddress();
if ((ipv6Bytes != null) &&
(ipv6Bytes.length == 16) &&
(ipv6Bytes[0] == (byte) 0xfe) &&
(ipv6Bytes[1] == (byte) 0x80) &&
(ipv6Bytes[11] == (byte) 0xff) &&
(ipv6Bytes[12] == (byte) 0xfe)) {
/*
* Allocate a byte array for storing the EUI-48 MAC address, then fill it
* from the appropriate bytes of the IPv6 address. Invert the 7th bit
* of the first byte and discard the "ff:fe" portion of the modified
* EUI-64 MAC address.
*/
eui48mac = new byte[6];
eui48mac[0] = (byte) (ipv6Bytes[8] ^ 0x2);
eui48mac[1] = ipv6Bytes[9];
eui48mac[2] = ipv6Bytes[10];
eui48mac[3] = ipv6Bytes[13];
eui48mac[4] = ipv6Bytes[14];
eui48mac[5] = ipv6Bytes[15];
}
}
return eui48mac;
}