Как получить адрес Wi-Fi Mac в Android Marshmallow
Я использую MAC-адрес WiFi как уникальный идентификатор, начиная с Marshmallow и возвращая поддельный MAC-адрес (по соображениям безопасности). С этим мое приложение Android ведет себя по-другому. Как получить фактический MAC-адрес устройства Android.
Я использую следующий фрагмент кода.
WifiManager wmgr = (WifiManager)getSystemService(Context.WIFI_SERVICE);
String wifiId = wmgr.getConnectionInfo().getMacAddress();
В файле манифеста добавляются следующие разрешения.
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Ответы
Ответ 1
Существует работа, чтобы получить адрес Mac в Android 6.0.
Сначала вам нужно добавить разрешение на использование Интернета.
<uses-permission android:name="android.permission.INTERNET" />
Затем вы можете найти mac через API-интерфейс NetworkInterfaces.
public static String getMacAddr() {
try {
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif : all) {
if (!nif.getName().equalsIgnoreCase("wlan0")) continue;
byte[] macBytes = nif.getHardwareAddress();
if (macBytes == null) {
return "";
}
StringBuilder res1 = new StringBuilder();
for (byte b : macBytes) {
res1.append(String.format("%02X:",b));
}
if (res1.length() > 0) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString();
}
} catch (Exception ex) {
}
return "02:00:00:00:00:00";
}
Источник: http://robinhenniges.com/en/android6-get-mac-address-programmatically
Ответ 2
FWIW решение, размещенное Робом Андерсоном, которое исходит от источника, который он привел, вернет MAC-адрес с шестнадцатеричными шестнадцатеричными символами в нижнем регистре и будет пропускать любые ведущие нули (например, "12: 34: 56: 78: 90: 0A" стать "12: 34: 56: 78: 90: a" ), который в зависимости от устройства приведет к созданию недопустимых MAC-адресов.
Это поведение связано с методом Integer.toHexString, который используется в примере, вызывающим скрытый метод AOSP java.lang.IntegralToString:: intToHexString (int i, bool uppercase, int minWidth) с ложным значением для верхнего регистра и 0 для параметра minWidth.
Если вы хотите иметь верхний регистр и минимальную ширину 2, вы можете либо добавить метод IntegralToString:: intToHexString в свой проект, либо передать true/2 для этих параметров, или просто использовать String.format( "% 02X" ) вместо этого будет выполняться преобразование для вас с верхним регистром и шириной 2. Или еще более предпочтительным; вы можете использовать String.format( "% 02X:" ), который затем сохранит вам вызов добавления, чтобы добавить двоеточие после каждого байта.
Ответ 3
Я пошел на мой маршрутизатор Netgear и посмотрел на вкладку, в которой перечислены подключенные устройства, которые красиво создали MAC-идентификатор.
Если есть сомнения, выключите устройство и просмотрите список, затем включите его и просмотрите снова. Новое объявление - ваш MAC-идентификатор. Измените список маршрутизаторов, чтобы показать это.
Более крупный взгляд, как они могли бы скрыть ваш MAC-идентификатор, поскольку он является одним из основных идентификаторов состояния всемирного наблюдения?