web-dev-qa-db-fra.com

Obtenir l'adresse mac locale Bluetooth dans Guimauve

Avant Marshmallow, mon application obtiendrait l'adresse MAC de son appareil via BluetoothAdapter.getDefaultAdapter().getAddress().

Maintenant, avec Marshmallow Android renvoie 02:00:00:00:00:00

J'ai vu un lien (désolé je ne sais pas où maintenant) qui dit que vous devez ajouter l'autorisation supplémentaire

<uses-permission Android:name="Android.permission.LOCAL_MAC_ADDRESS"/> 

être capable de l'obtenir. Cependant cela ne fonctionne pas pour moi.

Une autorisation supplémentaire est-elle nécessaire pour obtenir l'adresse MAC?

Je ne suis pas sûr que cela soit pertinent ici, mais le manifeste comprend également 

<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>

Alors, y a-t-il un moyen d’obtenir l’adresse mac locale bluetooth?

19
Eric

En fin de compte, je n’ai pas reçu l’adresse MAC d’Android. Le périphérique Bluetooth a fini par fournir l'adresse MAC du périphérique Android, qui a été stockée et ensuite utilisée en cas de besoin. Oui, cela semble un peu génial, mais sur le projet sur lequel j'étais, le logiciel du périphérique Bluetooth était également en cours de développement et cela s'est avéré être le meilleur moyen de gérer la situation.

0
Eric

zmarties a raison, mais vous pouvez toujours obtenir l'adresse MAC par réflexion ou par Settings.Secure:

  String macAddress = Android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address");
37
blobbie

L'accès à l'adresse mac a été délibérément supprimé:

Pour fournir aux utilisateurs une protection accrue des données, à partir de cette version, Android supprime l’accès par programme à l’identifiant matériel local du périphérique pour les applications utilisant les API Wi-Fi et Bluetooth.

(à partir de Changements Android 6.0 )

11
zmarties

Vous pouvez accéder à l'adresse Mac à partir du fichier "/ sys/class/net /" + networkInterfaceName + "/ address" , où networkInterfaceName peut être wlan0 ou eth1.But. Son autorisation peut être lue. -protected, donc il se peut que cela ne fonctionne pas sur certains appareils ..__ Je joins également la partie code que j'ai obtenue 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 "";
    }
4
jinosh

Tout d'abord, les autorisations suivantes doivent être ajoutées à 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" />

Ensuite,

public static final String SECURE_SETTINGS_BLUETOOTH_ADDRESS = "bluetooth_address";

String macAddress = Settings.Secure.getString(getContentResolver(), SECURE_SETTINGS_BLUETOOTH_ADDRESS);

Ensuite, l'application doit être signée avec la clé OEM/système. Testé et vérifié sur Android 8.1.0.

3
Samantha

Veuillez utiliser le code ci-dessous pour obtenir l'adresse mac Bluetooth. laissez-moi savoir si des problèmes.

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

Obtenir l'adresse MAC par réflexion peut ressembler à ceci:

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

en utilisant une bibliothèque de réflexion (net.vidageek: mirror) mais vous aurez l’idée.

1
p2pkit

A bien fonctionné

 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