android 系统自动检测U盘,烧写MAC地址

    最近,需要给设备手动烧写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中注册广播:

 <!-- 广播注册 -->
        <receiver android:name="com.kv.setmac.broadcast.BurnMACAddressBroadcast" >
            <intent-filter>
                <action android:name="android.intent.action.MEDIA_MOUNTED" />

                <data android:scheme="file" />
            </intent-filter>
        </receiver>


之前没有加<data android:scheme="file" />这一句,接受者始终无法接收到系统发出的U盘检测广播。后来去找找原因,是因为系统广播室隐式传递,于是增加了一个过滤条件。通过这个条件即scheme可以找到我的广播接受者。这一句很重要。在处理广播时,先判断指定的文件是否存在,存在才跳转到一个页面进行mac地址烧写。


MACActivity:

/**
	 * 获取MAC地址
	 * 
	 * @return
	 */
	@SuppressLint("NewApi")
	public String getEthMac() {
		String str1 = "";
		byte[] arrayOfByte = null;
		int i = 0;
		try {
			Iterator<NetworkInterface> 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地址,注意加权限, <uses-permission android:name="android.permission.INTERNET" />


读取文件内容:

/**
	 * 读取文件内容
	 */
	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烧写。






android 系统自动检测U盘,烧写MAC地址

上一篇:Buildroot 外部编译器配置


下一篇:Android开发系列(二) 布局资源Layout的使用