2015-10-27 5 views
14

Pre Eibisch meine app erhalten würde es Geräte-MAC-Adresse über BluetoothAdapter.getDefaultAdapter().getAddress().Holen Bluetooth lokale MAC-Adresse in Eibisch

Jetzt mit Eibisch Android ist 02:00:00:00:00:00 zurück.

ich einigen Link sah (sorry, wo jetzt nicht sicher), dass der Sie die zusätzliche Erlaubnis

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

in der Lage sein, um es hinzufügen müssen. Aber es funktioniert nicht für mich.

Gibt es zusätzliche Berechtigungen, um die MAC-Adresse zu erhalten?

Ich bin nicht sicher, dass es hier relevant ist, aber das Manifest enthält auch

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

es ist also eine Möglichkeit, die lokale Bluetooth-MAC-Adresse zu bekommen?

Antwort

0

Wie sich herausstellt, endete ich nicht die MAC-Adresse von Android. Das Bluetooth-Gerät lieferte schließlich die MAC-Adresse des Android-Geräts, die gespeichert und dann bei Bedarf verwendet wurde. Ja, es scheint etwas unkonventionell zu sein, aber bei dem Projekt, in dem ich war, wurde auch die Bluetooth-Gerätesoftware entwickelt und dies stellte sich als der beste Weg heraus, mit der Situation umzugehen.

6

Zugriff auf die MAC-Adresse absichtlich entfernt worden:

mehr Datenschutz mit den Nutzern zu liefern, in dieser Version starten, entfernt Android programmatischen Zugriff auf die lokale Hardware-Kennung des Geräts für Anwendungen, die über Wi-Fi und Bluetooth-APIs.

(von Android 6.0 Changes)

+0

Ja. Ich hatte das gelesen. Der API 23 BluetoothAdapter hat jedoch folgende Eigenschaften: /** * Die Standard-MAC-Adresse wird an einen Client gemeldet, der nicht über die Berechtigung * android.permission.LOCAL_MAC_ADDRESS verfügt. * * @hide */ öffentliche statische letzte Zeichenfolge DEFAULT_MAC_ADDRESS = "02: 00: 00: 00: 00: 00"; Damit impliziert es soll eine Möglichkeit sein, um es zu bekommen. (Vielleicht noch nicht implementiert? Ich klammere zu hoffen.) – Eric

+0

Die LOCAL_MAC_ADDRESS Erlaubnis kann nur durch System-Anwendungen verwendet werden, und es ist unwahrscheinlich, dass Google das ändern wird. –

4

Sie Mac zugreifen Adresse aus der Datei "/ sys/class/net /" + networkInterfaceName + "/ Adresse", wo networkInterfaceName kann wlan0 oder eth1.But Seine Berechtigung kann schreibgeschützt sein, daher funktioniert es bei einigen Geräten möglicherweise nicht. Ich füge auch den Code-Teil an, den ich von SO bekommen 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 ""; 
    } 
+0

Danke. Es funktioniert auf den Nexus-Tablets, die ich ausprobiert habe. –

+2

Android N und neuer wird ebenfalls eine falsche MAC-Adresse mit dieser Methode zurückgeben. –

29

zmarties ist richtig, aber man kann immer noch die MAC-Adresse über Reflexion oder Settings.Secure erhalten:

String macAddress = android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address"); 
+0

Was ist mit Wifi-Adresse? Kannst du für Mac-Adresse umgehen? –

+0

Dieser arbeitete für mich auf Nexus 6P/Android 6.0.1 – Thomasleveil

+0

Dies wird verschiedene bdaddr geben (aber einen gültigen mac). Reflection-Methode gibt korrekt bdaddr. – Rilwan

1

gibt es die MAC-Adresse über Reflexion kann wie folgt 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 Reflexions-Bibliothek (net.vidageek: mirror), aber Sie werden die Idee bekommen.

+0

Code funktioniert nicht. Mit dem lib versuchte es immer null zurück auf serveral Geräten mit unterschiedlichen API-Ebenen – glethien

+1

ich nur den Code auf ein paar Geräte und bekam immer eine MAC-Adresse zurück (getestet mit targetSDK 22 auf Geräte mit 4.4, 5.0, 5.1 und 6.0) – p2pkit

+0

großen Werken auf 6.0, danke! – dimson

0

Verwenden Sie bitte den folgenden Code, um die Bluetooth MAC-Adresse zu erhalten. lassen Sie mich wissen, wenn irgendwelche Probleme.

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