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 .

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?

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.

  • StartActivityForResult de un servicio
  • "Error de detección de servicio" en Android Bluetooth Insecure Rfcomm
  • ¿Cómo comprobar si el bluetooth está habilitado mediante programación?
  • ¿Dónde deberíamos invocar setPin () para el emparejamiento de bluetooth en android?
  • OnServicesDiscovered nunca se llama mientras se conecta a GATT Server
  • La conexión BluetoothSocket de Android devuelve cero
  • Comunicarse con Android dispositivo bluetooth a través de NodeJS y Termux
  • Android: ¿Conectar dos teléfonos inalámbricamente?
  • La ubicación debe estar habilitada para Bluetooth Low Energy Scanning en Android 6.0
  • ¿Qué dispositivos Android admiten jni?
  • ¿Cómo puedo conectar correctamente una aplicación de Android a un socket RFCOMM en un microcontrolador Arduino habilitado para Bluetooth?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.