Obtener la dirección MAC local de Bluetooth en Marshmallow
Pre Marshmallow mi aplicación obtendría su dirección MAC del dispositivo vía BluetoothAdapter.getDefaultAdapter().getAddress().
Ahora con Marshmallow Android está regresando 02:00:00:00:00:00
.
- Cómo encontrar dispositivos compatibles con Android Bluetooth
- Envío de un archivo utilizando Bluetooth OBEX Perfil de inserción de objetos (OPP)
- Aplicación de mapas personalizados en interiores
- Buscar Bandeja de entrada de Bluetooth
- Flujo de audio Bluetooth entre dispositivos Android
Vi algún enlace (lo siento no sé dónde ahora) que dijo que necesita agregar el permiso adicional
<uses-permission android:name="android.permission.LOCAL_MAC_ADDRESS"/>
para poder conseguirlo. Sin embargo, no funciona para mí.
¿Hay algún permiso adicional necesario para obtener la dirección MAC?
No estoy seguro de que sea pertinente aquí, pero el manifiesto también incluye
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
¿Así que hay una manera de obtener la dirección MAC bluetooth local?
- Cómo activar el bluetooth en el botón de clic
- Android 2.1 Detectar audio Bluetooth conectar / desconectar
- Conecte la PC y el teléfono Android con bluetooth (c #)
- Cómo evitar la conexión Bluetooth RFCOMM de morir inmediatamente después de .connect ()?
- Android AltBeacon Antecedentes
- ¿Cómo identifica * qué * dispositivo bluetooth causa una emisión ACTION_ACL_CONNECTED?
- Conexión Bluetooth RFCOMM / SDP a un adaptador RS232 en android
- Control de volumen del cliente manos libres Bluetooth
zmarties es correcto, pero todavía se puede obtener la dirección MAC a través de la reflexión o Settings.Secure:
String macAddress = android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address");
El acceso a la dirección MAC se ha eliminado deliberadamente:
Para ofrecer a los usuarios una mayor protección de datos, a partir de esta versión, Android elimina el acceso programático al identificador de hardware local del dispositivo para las aplicaciones que utilizan las APIs Wi-Fi y Bluetooth.
(de los cambios de Android 6.0 )
Puede acceder a la dirección Mac desde el archivo "/ sys / class / net /" + networkInterfaceName + "/ address" , donde networkInterfaceName puede ser wlan0 o eth1.But Su permiso puede estar protegido contra lectura, por lo que puede no funcionar en algunos dispositivos . También estoy adjuntando la parte de código que obtuve de 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 ""; }
Conseguir la dirección MAC a través de la reflexión puede verse así:
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; } }
utilizando una biblioteca de reflexión (net.vidageek: mirror), pero obtendrá la idea.
Como resulta, terminé por no obtener la dirección MAC de Android. El dispositivo bluetooth terminó proporcionando la dirección MAC del dispositivo Android, que se almacenaba y luego se usaba cuando era necesario. Sí, parece un poco funky, pero en el proyecto que estaba en, el software del dispositivo bluetooth también se estaba desarrollando y esto resultó ser la mejor manera de lidiar con la situación.
- Cómo abrir el diseño en el botón de clic (android)
- Android Volley – BasicNetwork.performRequest: Código de respuesta inesperado 400