57

如何以编程方式获取 android 设备的 Mac Id。我已经完成了 IMIE 代码,我知道如何手动检查设备上的 Mac id,但不知道如何以编程方式查找。

4

8 回答 8

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

此外,在您的清单文件中添加以下权限

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

请参阅Android 6.0 更改

为了给用户提供更好的数据保护,从这个版本开始,Android 移除了对使用 Wi-Fi 和蓝牙 API 的应用程序的设备本地硬件标识符的编程访问。WifiInfo.getMacAddress() 和 BluetoothAdapter.getAddress() 方法现在返回 02:00:00:00:00:00 的常量值。

要通过蓝牙和 Wi-Fi 扫描访问附近外部设备的硬件标识符,您的应用现在必须具有 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限。

于 2012-05-31T10:16:32.750 回答
21

请参阅我已提交 Utils.java 示例以提供纯 Java 实现并在没有 WifiManager 的情况下工作的这篇文章。某些 android 设备可能没有可用的 wifi 或正在使用以太网接线。

Utils.getMACAddress("wlan0");
Utils.getMACAddress("eth0");
Utils.getIPAddress(true); // IPv4
Utils.getIPAddress(false); // IPv6 
于 2012-10-22T08:22:29.993 回答
11

使用此代码,您还可以在Android 6.0中获取 MacAddress

public static String getMacAddr() {
    try {
        List <NetworkInterface> 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";
}

编辑 1. 这个答案有一个错误,其中十六进制形式的字节有一个数字,不会出现在它之前的“0”。对 res1 的附加已更改以处理它。

于 2017-05-06T13:22:31.780 回答
8

它正在工作

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

更新 1

这个答案有一个错误,十六进制形式的字节有一个数字,不会在它之前出现“0”。附加到res1已更改以处理它。

 StringBuilder res1 = new StringBuilder();
                for (byte b : macBytes) {
                    // res1.append(Integer.toHexString(b & 0xFF) + ":");
                    res1.append(String.format("%02X:",b)); 
                }
于 2017-06-15T12:05:58.903 回答
4

这里 Kotlin 版本的 Arth Tilvas 回答:

fun getMacAddr(): String {
    try {
        val all = Collections.list(NetworkInterface.getNetworkInterfaces())
        for (nif in all) {
            if (!nif.getName().equals("wlan0", ignoreCase=true)) continue

            val macBytes = nif.getHardwareAddress() ?: return ""

            val res1 = StringBuilder()
            for (b in 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 (ex: Exception) {
    }

    return "02:00:00:00:00:00"
}
于 2019-01-07T11:19:49.037 回答
4

来自 Developer.Android.com 的最新更新

不使用 MAC 地址 MAC 地址是全球唯一的,用户不可重置,并且在出厂重置后仍然有效。由于这些原因,一般不建议使用 MAC 地址进行任何形式的用户识别。运行 Android 10(API 级别 29)及更高版本的设备会向所有非设备所有者应用程序报告随机 MAC 地址。

在 Android 6.0(API 级别 23)和 Android 9(API 级别 28)之间,无法通过第三方 API 获得本地设备 MAC 地址,例如 Wi-Fi 和蓝牙。WifiInfo.getMacAddress() 方法和 BluetoothAdapter.getDefaultAdapter().getAddress() 方法都返回 02:00:00:00:00:00。

此外,在 Android 6.0 和 Android 9 之间,您必须拥有以下权限才能通过蓝牙和 Wi-Fi 扫描访问附近外部设备的 MAC 地址:

需要方法/属性权限

ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION

来源:https ://developer.android.com/training/articles/user-data-ids.html#version_specific_details_identifiers_in_m

于 2020-03-17T18:31:55.960 回答
1
private fun getMac(): String? =
        try {
            NetworkInterface.getNetworkInterfaces()
                    .toList()
                    .find { networkInterface -> networkInterface.name.equals("wlan0", ignoreCase = true) }
                    ?.hardwareAddress
                    ?.joinToString(separator = ":") { byte -> "%02X".format(byte) }
        } catch (ex: Exception) {
            ex.printStackTrace()
            null
        }
于 2019-10-18T20:07:16.167 回答
-1

有一个简单的方法:

安卓:

   String macAddress = 
android.provider.Settings.Secure.getString(this.getApplicationContext().getContentResolver(), "android_id");

Xamarin:

    Settings.Secure.GetString(this.ContentResolver, "android_id");
于 2019-05-01T12:23:23.367 回答