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