Vor Marshmallow würde meine App die MAC-Adresse des Geräts über BluetoothAdapter.getDefaultAdapter().getAddress().
erhalten.
Jetzt mit Marshmallow kehrt Android 02:00:00:00:00:00
zurück.
Ich habe einen Link gesehen (sorry nicht jetzt wo), der sagte, dass Sie die zusätzliche Berechtigung hinzufügen müssen
<uses-permission Android:name="Android.permission.LOCAL_MAC_ADDRESS"/>
in der Lage sein, es zu bekommen. Es funktioniert jedoch nicht für mich.
Gibt es eine zusätzliche Berechtigung, um die MAC-Adresse zu erhalten?
Ich bin nicht sicher, ob es hier relevant ist, aber das Manifest umfasst auch
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>
Gibt es eine Möglichkeit, die lokale Bluetooth-MAC-Adresse zu erhalten?
Wie sich herausstellte, bekam ich schließlich keine MAC-Adresse von Android. Das Bluetooth-Gerät lieferte schließlich die MAC-Adresse des Android-Geräts, die gespeichert und bei Bedarf verwendet wurde. Ja, es scheint ein bisschen funky zu sein, aber bei meinem Projekt wurde auch die Bluetooth-Gerätesoftware entwickelt, und dies stellte sich als der beste Weg heraus, mit der Situation umzugehen.
zmarties hat recht, aber Sie können die MAC-Adresse immer noch über Reflection oder Settings erhalten.
String macAddress = Android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address");
Der Zugriff auf die MAC-Adresse wurde absichtlich entfernt:
Um Benutzern einen besseren Datenschutz zu bieten, entfernt Android ab dieser Version den programmgesteuerten Zugriff auf die lokale Hardware-ID des Geräts für Apps, die WLAN- und Bluetooth-APIs verwenden.
(von Android 6.0 Änderungen )
Sie können auf die Mac-Adresse aus der Datei "/ sys/class/net /" + networkInterfaceName + "/ address" zugreifen, wobei networkInterfaceName wlan0 oder eth1 sein kann. Die Berechtigung kann jedoch gelesen werden -geschützt, daher kann es in einigen Geräten nicht funktionieren. Ich füge auch den Codeteil hinzu, den ich von SO erhalten habe.
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 "";
}
Zuerst müssen die folgenden Berechtigungen zu Manifest hinzugefügt werden.
<uses-permission Android:name="Android.permission.BLUETOOTH" />
<uses-permission Android:name="Android.permission.BLUETOOTH_ADMIN" />
<uses-permission Android:name="Android.permission.LOCAL_MAC_ADDRESS" />
Dann,
public static final String SECURE_SETTINGS_BLUETOOTH_ADDRESS = "bluetooth_address";
String macAddress = Settings.Secure.getString(getContentResolver(), SECURE_SETTINGS_BLUETOOTH_ADDRESS);
Danach muss die Anwendung mit dem OEM/System Key signiert werden. Getestet und überprüft auf Android 8.1.0.
Bitte verwenden Sie den untenstehenden Code, um die Bluetooth-MAC-Adresse zu erhalten. Lassen Sie mich wissen, wenn Probleme auftreten.
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;
}
Das Erhalten der MAC-Adresse über Reflection kann folgendermaßen aussehen:
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;
}
}
mit einer Reflexionsbibliothek (net.vidageek: mirror), aber Sie bekommen die Idee.
Hat super gearbeitet
private String getBluetoothMacAddress() {
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
String bluetoothMacAddress = "";
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 | NoSuchMethodException | IllegalAccessException | InvocationTargetException ignore) {
}
return bluetoothMacAddress;
}