本文轉載自:http://blog.csdn.net/crazyman2010/article/details/50464256
今天對MAC地址的獲取做了一些學習,目前網上獲取MAC地址的方法主要如下:
- 使用busybox ifconfig
- 使用cat /sys/class/net/wlan0/address
- 使用WifiInfo.getMacAddress
- 使用NetworkInterface.getHardwareAddress
在飛行模式下,基本所有方法都不可用。
BusyBox ifconfig
並不是所有的機器都裝了busybox,所以,使用busybox的兼容性比較差。這個可以使用android終端命令netcfg來代替(最后一列就是MAC地址):
cat /sys/class/net/wlan0/address
這種方法是通過讀取網卡驅動提供的MAC地址信息,一般比較可靠,但是同busybox ifconfig或netcfg一樣,需要手動解析返回的字符串。
WifiInfo.getMacAddress
WifiManager wifiManager=(WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo=wifiManager.getConnectionInfo();
String mac=wifiInfo.getMacAddress();
- 1
- 2
- 3
- 4
這種方法比較通用,原來一直用這個,但是最近發現,在Android 6.0系統上,這個方法失效了,返回了”02:00:00:00:00:00”的常量,網上有人說是權限問題,但是已經把所有權限都打開了,還是返回這個值,可能是一個bug,或許在將來這個問題會被修復。
網友提示后,發現這並不是一個BUG,在google的博客中找到如下一段話:
Most notably, Local WiFi and Bluetooth MAC addresses are no longer available. The getMacAddress() method of a WifiInfo object and the BluetoothAdapter.getDefaultAdapter().getAddress() method will both return 02:00:00:00:00:00 from now on.
NetworkInterface.getHardwareAddress
這個是我目前使用的方法,其原理和cat /sys/class/net/wlan0/address是一模一樣的,但是這個是上層API,不需要自己處理底層數據。在Android 6.0上測試通過。
networkInterface = NetworkInterface.getByName("wlan0");
return ConvertMacAddressBytesToString(networkInterface.getHardwareAddress());