1. 程式人生 > >Android mac地址獲取的方法小結及可能出現的問題

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
().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;
    這個效果圖我就不貼了,總結一下就是必須把wifi按鈕開啟,即使不連也行,當wifi關閉時候無法獲取到mac地址。

 具體原理參考: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