最近,需要給設備手動燒寫MAC地址。用戶插入U盤到盒子,系統自動讀取U盤裡面的文件,獲取到文件內容,即mac地址。再調用底層接口即可完成mac地址的燒寫。我所需要做的就是檢測U盤,讀取文件,根據接口返回值來判斷是否燒寫成功。
讀取文件,調用接口都很簡單,唯獨檢測U盤這個問題煩惱瞭許久。原來android系統會自動檢測,根據U盤的插入與拔出分別發出相對應的廣播。我隻需要註冊一個廣播接受者,即可收到系統發出的廣播。
系統檢測U盤有三種狀態:
1. 檢測到U盤:android.intent.action.MEDIA_CHECKING
2. 連接U盤:android.intent.action.MEDIA_MOUNTED
3. 斷開連接:android.intent.action.MEDIA_UNMOUNTED
連接廣播:
public class BurnMACAddressBroadcast extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { File usbFile = new File("mnt/sda/sda1/kvUpdateMac/usbUpdateMac.txt"); if(usbFile.exists()){ Intent updateintent = new Intent(context,MACActivity.class); updateintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(updateintent); } } }
為瞭能在開機後的任何情況下都能夠接收到廣播,先到mainfest中註冊廣播:
之前沒有加這一句,接受者始終無法接收到系統發出的U盤檢測廣播。後來去找找原因,是因為系統廣播室隱式傳遞,於是增加瞭一個過濾條件。通過這個條件即scheme可以找到我的廣播接受者。這一句很重要。在處理廣播時,先判斷指定的文件是否存在,存在才跳轉到一個頁面進行mac地址燒寫。
MACActivity:
/** * 獲取MAC地址 * * @return */ @SuppressLint("NewApi") public String getEthMac() { String str1 = ""; byte[] arrayOfByte = null; int i = 0; try { Iterator localIterator = Collections.list( NetworkInterface.getNetworkInterfaces()).iterator(); while (true) { if (!localIterator.hasNext()) return null; NetworkInterface localNetworkInterface = (NetworkInterface) localIterator .next(); if (!localNetworkInterface.getDisplayName().equals("eth0")) continue; arrayOfByte = localNetworkInterface.getHardwareAddress(); if (arrayOfByte == null) return null; if (i < arrayOfByte.length) break; } } catch (Exception e) { e.printStackTrace(); } StringBuffer localStringBuilder = null; if (arrayOfByte != null) { localStringBuilder = new StringBuffer(); for (int j = 0; j < arrayOfByte.length; j++) { String str = Integer.toHexString(arrayOfByte[j] & 0xFF); if (str.length() == 1) { localStringBuilder.append("0"); } localStringBuilder.append(str); localStringBuilder.append(":"); } str1 = localStringBuilder.deleteCharAt( localStringBuilder.length() - 1).toString(); } return str1.toUpperCase(); }
獲取利用android標準API獲取mac地址,註意加權限,
讀取文件內容:
/** * 讀取文件內容 */ private void readFileMac() { File usbFile = new File("mnt/sda/sda1/kvUpdateMac/usbUpdateMac.txt"); if (!usbFile.exists()) { return; } FileInputStream inputStream = null; try { inputStream = new FileInputStream(usbFile); byte[] buffer = new byte[inputStream.available()]; inputStream.read(buffer); String hhh = new String(buffer); String macthMac = "[0-9A-Fa-f]{12}"; if (hhh.length() == 12 && hhh.matches(macthMac)) { mac = hhh; } else { mac = ""; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (inputStream != null) { inputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } }
將獲取到的mac字符串傳到底層,通過一些列動態庫完成mac燒寫。