如何以编程方式查找Android设备的MAC地址

时间:2012-05-31 10:12:28

标签: android

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

8 个答案:

答案 0 :(得分:115)

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 Changes

  

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

     

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

答案 1 :(得分:14)

See this post我已经提交了Utils.java示例以提供纯java实现,并且在没有WifiManager的情况下工作。有些Android设备可能没有wifi可用或使用以太网接线。

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

答案 2 :(得分:7)

使用此代码,您还可以在 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的附加内容已更改为处理它。

答案 3 :(得分:4)

正在运作

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

答案 4 :(得分:3)

Developer.Android.com上的最新更新

不适用于MAC地址MAC地址是全局唯一的,不是全局的 用户可重置,并在恢复出厂设置后仍然有效。由于这些原因, 通常不建议将MAC地址用于任何形式的用户 识别。运行Android 10(API级别29)及更高版本的设备 向不是设备所有者的所有应用报告随机MAC地址 应用。

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

此外,在Android 6.0和Android 9之间,您必须按住 遵循以下权限来访问附近外部设备的MAC地址 通过蓝牙和Wi-Fi扫描可用的设备:

所需的方法/属性权限

ACCESS_FINE_LOCATION或 ACCESS_COARSE_LOCATION

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

答案 5 :(得分:0)

这里是Arth Tilvas的Kotlin版本答案:

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

答案 6 :(得分:0)

有一个简单的方法:

Android:

import

Xamarin:

import foo from "../../../whatever/typings/foo"

答案 7 :(得分:0)

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
        }