Получить локальный MAC-адрес Bluetooth в Marshmallow

Pre Marshmallow мое приложение получит MAC-адрес устройства через BluetoothAdapter.getDefaultAdapter().getAddress().

Теперь с Marshmallow Android возвращается 02:00:00:00:00:00.

Я видел некоторую ссылку (извините, не знаю, где сейчас), в которой говорилось, что вам нужно добавить дополнительное разрешение

<uses-permission android:name="android.permission.LOCAL_MAC_ADDRESS"/> 

чтобы получить его. Однако он не работает для меня.

Есть ли дополнительные разрешения, необходимые для получения адреса mac?

Я не уверен, что это уместно, но манифест также включает

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

Итак, есть способ получить локальный адрес mac bluetooth?

Ответы

Ответ 1

Как оказалось, я не получил MAC-адрес от Android. Устройство Bluetooth установило MAC-адрес устройства Android, который был сохранен, а затем использован, когда это необходимо. Да, это кажется немного напуганным, но в проекте, в котором я работал, также разрабатывалось программное обеспечение устройства Bluetooth, и это оказалось лучшим способом справиться с ситуацией.

Ответ 2

zmarties прав, но вы все равно можете получить адрес mac через отражение или Settings.Secure:

  String macAddress = android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address");

Ответ 3

Доступ к MAC-адресу был умышленно удален:

Чтобы предоставить пользователям более полную защиту данных, начиная с этой версии, Android удаляет программный доступ к локальному идентификатору аппаратного обеспечения устройств для приложений с использованием API Wi-Fi и Bluetooth.

(от изменений Android 6.0)

Ответ 4

Вы можете получить доступ к адресу Mac из файла "/sys/class/net/" + networkInterfaceName + "/address" , где networkInterfaceName может быть wlan0 или eth1. Но его разрешение может быть защищено от чтения, поэтому оно может не работать на некоторых устройствах. Я также прикрепляю часть кода, которую я получил от SO.

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 exp) {

            exp.printStackTrace();
        } 
        return "";
    }

Ответ 5

Пожалуйста, используйте приведенный ниже код, чтобы получить адрес mac bluetooth. сообщите мне, если возникнут какие-либо проблемы.

private String getBluetoothMacAddress() {
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    String bluetoothMacAddress = "";
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
        try {
            Field mServiceField = bluetoothAdapter.getClass().getDeclaredField("mService");
            mServiceField.setAccessible(true);

            Object btManagerService = mServiceField.get(bluetoothAdapter);

            if (btManagerService != null) {
                bluetoothMacAddress = (String) btManagerService.getClass().getMethod("getAddress").invoke(btManagerService);
            }
        } catch (NoSuchFieldException e) {

        } catch (NoSuchMethodException e) {

        } catch (IllegalAccessException e) {

        } catch (InvocationTargetException e) {

        }
    } else {
        bluetoothMacAddress = bluetoothAdapter.getAddress();
    }
    return bluetoothMacAddress;
}

Ответ 6

Получение MAC-адреса через отражение может выглядеть следующим образом:

private static String getBtAddressViaReflection() {
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    Object bluetoothManagerService = new Mirror().on(bluetoothAdapter).get().field("mService");
    if (bluetoothManagerService == null) {
        Log.w(TAG, "couldn't find bluetoothManagerService");
        return null;
    }
    Object address = new Mirror().on(bluetoothManagerService).invoke().method("getAddress").withoutArgs();
    if (address != null && address instanceof String) {
        Log.w(TAG, "using reflection to get the BT MAC address: " + address);
        return (String) address;
    } else {
        return null;
    }
}

используя библиотеку отражения (net.vidageek: mirror), но вы получите эту идею.

Ответ 7

Сначала в Manifest должны быть добавлены следующие разрешения:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.LOCAL_MAC_ADDRESS" />

Затем,

public static final String SECURE_SETTINGS_BLUETOOTH_ADDRESS = "bluetooth_address";

String macAddress = Settings.Secure.getString(getContentResolver(), SECURE_SETTINGS_BLUETOOTH_ADDRESS);

После этого приложение должно быть подписано с ключом OEM/System. Протестировано и проверено на Android 8.1.0.