Как получить адрес 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-идентификатор, поскольку он является одним из основных идентификаторов состояния всемирного наблюдения?