Android mac地址獲取的方法小結及可能出現的問題
這段時間專案遇到個問題,客戶把移動裝置回廠修理後再安裝我們的專案,執行會報錯。後來經過我仔細排查發現一個很詭異的問題,就是無法獲取mac地址了。於是我仔細把獲取mac地址的一些資料看了看,加上一些除錯,總算是解決了這個問題。現在決定把這塊小結下,以免再次遇到問題。
mac地址又稱為實體地址,和ip地址不同的是,mac地址由網絡卡決定,也就是一個裝置只能有一個mac地址,所以經常作為唯一標識碼來使用。我在網上找了下,總共找到四中獲取mac地址的方法。
1.通過wifimaneger來獲取
wifimaneger是Android裡對wifi的管理器,可以通過它查詢到網絡卡狀態,無線訊號列表,當前網路,連線ip,以及mac地址等。這是目前比較常見的一種,我用手機試了下,發現這個方法在手機剛開機時候是沒用的,如圖所示:
當我打開了wifi(即使不連)以後,就可以獲取到正常的mac地址了,如圖所示:
然後我發現,其實這個wifimaneger裡獲取的就和手機裡的高階wlan裡顯示的一樣,獲取的mac地址或者是ip地址,如圖所示:
程式碼為:
mWifiManager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); mWifiInfo = mWifiManager.getConnectionInfo();
String mScanResult = mWifiAdmin.getMacAddress();
總結下就是:wifimaneger獲取mac必須是開啟wifi設定過一次(之後關閉也沒事),之後就會正常獲取到mac。我想可能是開啟wifi設定就會查詢網絡卡資訊,獲取到mac的值,並記錄下來。
2.通過linux底層的方法獲取
這個也是比較常見的方法,android 底層是 Linux,我們用Linux的方法肯定能獲取的,具體程式碼如下:
public static String getLocalMacAddress() { String macSerial = null; String str = ""; try { Process pp = Runtime.getRuntime這個效果圖我就不貼了,總結一下就是必須把wifi按鈕開啟,即使不連也行,當wifi關閉時候無法獲取到mac地址。().exec( "cat /sys/class/net/wlan0/address "); InputStreamReader ir = new InputStreamReader(pp.getInputStream()); LineNumberReader input = new LineNumberReader(ir); for (; null != str;) { str = input.readLine(); if (str != null) { macSerial = str.trim();// 去空格 break; } } } catch (IOException ex) { // 賦予預設值 ex.printStackTrace(); } return macSerial;
具體原理參考:http://www.tuicool.com/articles/ameQJfN 這位大神的文章。
3.通過busybox,cmd獲取,具體程式碼如下:
result = GetMac_3.callCmd("busybox ifconfig","HWaddr");
public static String callCmd(String cmd,String filter) { String result = ""; String line = ""; try { Process proc = Runtime.getRuntime().exec(cmd); InputStreamReader is = new InputStreamReader(proc.getInputStream()); BufferedReader br = new BufferedReader(is); //執行命令cmd,只取結果中含有filter的這一行 while ((line = br.readLine ()) != null && line.contains(filter)== false) { //result += line; Log.i("test","line: "+line); } result = line; Log.i("test","result: "+result); } catch(Exception e) { e.printStackTrace(); } return result;
第四種是根據IP獲取本地mac
public static String getLocalMacAddressFromIp(Context context) { String mac_s= ""; try { byte[] mac; NetworkInterface ne=NetworkInterface.getByInetAddress(InetAddress.getByName(getLocalIpAddress())); mac = ne.getHardwareAddress(); mac_s = byte2hex(mac); } catch (Exception e) { e.printStackTrace(); } return mac_s;
實話來說,第三和第四的方法我都沒獲取到mac。但是網上很多都提到了這兩種方法,所以特地寫出來供參考。
比如這篇就提到了http://blog.csdn.net/crazyman2010/article/details/50464256