it-swarm.com.de

Bluetooth-MAC-Adresse in Marshmallow erhalten

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?

19
Eric

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.

0
Eric

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");
37
blobbie

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 )

11
zmarties

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 "";
    }
4
jinosh

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.

3
Samantha

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;
}
3
RaghavPai

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.

1
p2pkit

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;
    }
0
Vinayak