Получить локальный 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?

Solutions Collecting From Web of "Получить локальный MAC-адрес Bluetooth в Marshmallow"

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

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

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

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

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

Вы можете получить доступ к адресу 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 ""; } 

Получение 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), но вы получите эту идею.

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