Cómo encontrar la dirección MAC de un dispositivo Android programáticamente

¿Cómo obtengo Mac Id de un dispositivo Android programáticamente? Lo he hecho con el código IMIE y sé cómo verificar la identificación de Mac en el dispositivo de forma manual, pero no tengo idea de cómo encontrarlo programáticamente.

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

Además, agregue el permiso debajo en su archivo de manifiesto

  

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.

Consulte esta publicación donde he enviado el ejemplo de Utils.java para proporcionar implementaciones de Java puro y funciona sin WifiManager. Es posible que algunos dispositivos Android no tengan wifi disponible o que estén usando un cableado de ethernet.

 Utils.getMACAddress("wlan0"); Utils.getMACAddress("eth0"); Utils.getIPAddress(true); // IPv4 Utils.getIPAddress(false); // IPv6 

Con este código también podrá obtener MacAddress en Android 6.0 también

 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) + ":"); 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"; } 

EDITAR 1. Esta respuesta obtuvo un error donde un byte que en forma hexadecimal obtuvo un solo dígito, no aparecerá con un “0” antes. El apéndice a res1 ha sido modificado para solucionarlo.

Esta funcionando

  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) + ":"); res1.append(String.format("%02X:",b)); } if (res1.length() > 0) { res1.deleteCharAt(res1.length() - 1); } return res1.toString(); } } catch (Exception ex) { //handle exception } return ""; } } 

ACTUALIZACIÓN 1

Esta respuesta obtuvo un error donde un byte que en forma hexagonal obtuvo un solo dígito, no aparecerá con un “0” antes. El res1 a res1 ha sido modificado para res1 .

  StringBuilder res1 = new StringBuilder(); for (byte b : macBytes) { // res1.append(Integer.toHexString(b & 0xFF) + ":"); res1.append(String.format("%02X:",b)); }