Progtwigdo obtener el MAC de un dispositivo Android

Necesito obtener la dirección MAC de mi dispositivo Android usando Java. He buscado en línea, pero no he encontrado nada útil.

Como ya se señaló en el comentario, la dirección MAC se puede recibir a través del Administrador de Wifi .

WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo info = manager.getConnectionInfo(); String address = info.getMacAddress(); 

Además, no olvide agregar los permisos adecuados en su AndroidManifest.xml

  

Por favor, consulte los cambios de Android 6.0 .

Para proporcionar a los usuarios una mayor protección de datos, a partir de esta versión, Android elimina el acceso programático al identificador de hardware local del dispositivo para aplicaciones que utilizan las API de Wi-Fi y Bluetooth. Los métodos WifiInfo.getMacAddress () y BluetoothAdapter.getAddress () ahora devuelven un valor constante de 02: 00: 00: 00: 00: 00.

Para acceder a los identificadores de hardware de los dispositivos externos cercanos a través de escaneos Bluetooth y Wi-Fi, su aplicación ahora debe tener los permisos ACCESS_FINE_LOCATION o ACCESS_COARSE_LOCATION.

Obtener la dirección MAC a través de WifiInfo.getMacAddress() no funcionará en Marshmallow y superior, se ha deshabilitado y devolverá el valor constante de 02:00:00:00:00:00 .

  public String getMacAddress(Context context) { WifiManager wimanager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); String macAddress = wimanager.getConnectionInfo().getMacAddress(); if (macAddress == null) { macAddress = "Device don't have mac address or wi-fi is disabled"; } return macAddress; } 

tener otros camino aquí

 public static String getMacAddr() { try { List all = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface nif : all) { if (!nif.getName().equalsIgnoreCase("wlan0")) continue; byte[] macBytes = nif.getHardwareAddress(); if (macBytes == null) { return ""; } StringBuilder res1 = new StringBuilder(); for (byte b : macBytes) { res1.append(String.format("%02X:",b)); } if (res1.length() > 0) { res1.deleteCharAt(res1.length() - 1); } return res1.toString(); } } catch (Exception ex) { } return "02:00:00:00:00:00"; } 

Está trabajando con Marshmallow

 package com.keshav.fetchmacaddress; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Collections; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.e("keshav","getMacAddr -> " +getMacAddr()); } public static String getMacAddr() { try { List all = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface nif : all) { if (!nif.getName().equalsIgnoreCase("wlan0")) continue; byte[] macBytes = nif.getHardwareAddress(); if (macBytes == null) { return ""; } StringBuilder res1 = new StringBuilder(); for (byte b : macBytes) { res1.append(Integer.toHexString(b & 0xFF) + ":"); } if (res1.length() > 0) { res1.deleteCharAt(res1.length() - 1); } return res1.toString(); } } catch (Exception ex) { //handle exception } return ""; } } 

Puedes obtener la dirección MAC:

 WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo wInfo = wifiManager.getConnectionInfo(); String mac = wInfo.getMacAddress(); 

Establecer permiso en Menifest.xml

  

Ya no puede obtener la dirección MAC de hardware de un dispositivo Android. Los métodos WifiInfo.getMacAddress () y BluetoothAdapter.getAddress () devolverán 02: 00: 00: 00: 00: 00. Esta restricción se introdujo en Android 6.0.

Pero Rob Anderson encontró una solución que funciona para https://stackoverflow.com/a/35830358

Probé este código yo mismo y le dará la dirección MAC o WiFi lo que esté disponible.

  public static String getMacAddr() { try { List all = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface nif : all) { if (!nif.getName().equalsIgnoreCase("wlan0")) continue; byte[] macBytes = nif.getHardwareAddress(); if (macBytes == null) { return ""; } StringBuilder res1 = new StringBuilder(); for (byte b : macBytes) { res1.append(Integer.toHexString(b & 0xFF) + ":"); } StringBuilder sb = new StringBuilder(); for (int i = 0; i < macBytes.length; i++) { sb.append(String.format("%02X%s", macBytes[i], (i < macBytes.length - 1) ? "-" : "")); } if (res1.length() > 0) { res1.deleteCharAt(res1.length() - 1); } return res1.toString(); } } catch (Exception ex) { //handle exception } return getMacAddress(); } public static String loadFileAsString(String filePath) throws java.io.IOException{ StringBuffer data = new StringBuffer(1000); BufferedReader reader = new BufferedReader(new FileReader(filePath)); char[] buf = new char[1024]; int numRead=0; while((numRead=reader.read(buf)) != -1){ String readData = String.valueOf(buf, 0, numRead); data.append(readData); } reader.close(); return data.toString(); } public static String getMacAddress(){ try { return loadFileAsString("/sys/class/net/eth0/address") .toUpperCase().substring(0, 17); } catch (IOException e) { e.printStackTrace(); return "02:00:00:00:00:00"; } } 

¡Fundé esta solución de http://robinhenniges.com/en/android6-get-mac-address-programmatically y está funcionando para mí! ¡Hope ayuda!

 public static String getMacAddr() { try { List all = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface nif : all) { if (!nif.getName().equalsIgnoreCase("wlan0")) continue; byte[] macBytes = nif.getHardwareAddress(); if (macBytes == null) { return ""; } StringBuilder res1 = new StringBuilder(); for (byte b : macBytes) { String hex = Integer.toHexString(b & 0xFF); if (hex.length() == 1) hex = "0".concat(hex); res1.append(hex.concat(":")); } if (res1.length() > 0) { res1.deleteCharAt(res1.length() - 1); } return res1.toString(); } } catch (Exception ex) { } return ""; } 

Tomado de las fonts de Android aquí . Este es el código real que muestra su DIRECCIÓN MAC en la aplicación de configuración del sistema.

 private void refreshWifiInfo() { WifiInfo wifiInfo = mWifiManager.getConnectionInfo(); Preference wifiMacAddressPref = findPreference(KEY_MAC_ADDRESS); String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress(); wifiMacAddressPref.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress : getActivity().getString(R.string.status_unavailable)); Preference wifiIpAddressPref = findPreference(KEY_CURRENT_IP_ADDRESS); String ipAddress = Utils.getWifiIpAddresses(getActivity()); wifiIpAddressPref.setSummary(ipAddress == null ? getActivity().getString(R.string.status_unavailable) : ipAddress); } 

Creo que acabo de encontrar una forma de leer las direcciones MAC sin permiso de LOCATION: Ejecutar ip addr y analizar su salida. (Probablemente podrías hacer lo similar al mirar el código fuente de este binario)