2015-10-27 15 views
14

Pre Marshmallow mia app otterrebbe è indirizzo MAC del dispositivo tramite BluetoothAdapter.getDefaultAdapter().getAddress().Get Bluetooth MAC address locale nella Marshmallow

Ora con Marshmallow Android sta tornando 02:00:00:00:00:00.

ho visto qualche link (scusate non so dove ora) che ha detto è necessario aggiungere l'autorizzazione aggiuntiva

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

per essere in grado di farlo. Tuttavia non sta funzionando per me.

Esiste qualche autorizzazione aggiuntiva necessaria per ottenere l'indirizzo mac?

io non sono sicuro che è pertinente qui, ma il manifesto include anche

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

Quindi c'è un modo per ottenere l'indirizzo bluetooth mac locale?

risposta

0

Come risulta, ho finito per non ottenere l'indirizzo MAC da Android. Il dispositivo bluetooth ha finito per fornire l'indirizzo MAC del dispositivo Android, che è stato memorizzato e quindi utilizzato quando necessario. Sì, sembra un po 'strano, ma sul progetto in cui mi trovavo, il software del dispositivo bluetooth era in fase di sviluppo e questo si è rivelato il modo migliore per affrontare la situazione.

6

L'accesso al MAC address è stato volutamente rimosso:

per fornire agli utenti una maggiore protezione dei dati, a partire in questa versione, Android rimuove l'accesso programmatico a identificatore hardware locale del dispositivo per le applicazioni che utilizzano il Wi-Fi e le API Bluetooth.

(da Android 6.0 Changes)

+0

Sì. L'avevo letto. Ma l'API 23 BluetoothAdapter ha il seguente: /** * Indirizzo MAC predefinito segnalato a un client che non dispone dell'autorizzazione * android.permission.LOCAL_MAC_ADDRESS. * * @hide */ stringa statica finale pubblica DEFAULT_MAC_ADDRESS = "02: 00: 00: 00: 00: 00"; Quindi questo implica che ci sia un modo per ottenerlo. (Forse non ancora implementato? Mi aggrappo alla speranza.) – Eric

+0

L'autorizzazione LOCAL_MAC_ADDRESS può essere utilizzata solo dalle app di sistema ed è improbabile che Google la cambierà. –

4

È possibile accedere a indirizzo MAC dal file "/ sys/class/net /" + networkInterfaceName + "/ indirizzo", dove networkInterfaceName può essere wlan0 o eth1.Ma La sua autorizzazione può essere protetta dalla lettura, quindi potrebbe non funzionare su alcuni dispositivi. Allego anche la parte di codice che ho ricevuto da 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 ""; 
    } 
+0

Grazie. Funziona con le tavolette Nexus che ho provato. –

+2

Android N e successivi restituiranno un falso indirizzo MAC utilizzando anche questo metodo. –

29

zmarties è giusto, ma è ancora possibile ottenere l'indirizzo MAC attraverso la riflessione o Settings.Secure:

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

e per quanto riguarda l'indirizzo wifi? , puoi gestire l'indirizzo mac? –

+0

Questo ha funzionato per me su Nexus 6P/Android 6.0.1 – Thomasleveil

+0

Questo sta dando un diverso bdaddr (ma un mac valido). Il metodo di riflessione sta dando il corretto bdaddr. – Rilwan

1

Ottenere l'indirizzo MAC attraverso la riflessione può apparire così:

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

usando una reflection library (net.vidageek: mirror) ma avrai un'idea.

+0

Il codice non funziona. Con la lib restituisce sempre null su dispositivi server con diversi livelli API – glethien

+1

Ho appena provato il codice su alcuni dispositivi e ho sempre ottenuto un indirizzo mac (testato con targetSDK 22 su dispositivi con 4.4, 5.0, 5.1 e 6.0) – p2pkit

+0

funziona bene in 6.0, grazie! – dimson

0

Utilizzare il seguente codice per ottenere l'indirizzo mac bluetooth. fammi sapere se ci sono problemi

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