android获取有线网的Mac地址

本文介绍了两种在Android TV上获取有线网络Mac地址的方法,并通过实际测试对比了这两种方法的准确性。第一种方法通过InetAddress和NetworkInterface获取硬件地址;第二种方法通过遍历所有网络接口并检查有效的IPv4地址来获取Mac地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android TV开发中有的机器会接有线网,需要获取Mac地址,下面是我测试的两种Mac地址的获取方式。

1.一共两个方法,目前第二个方法获取的不准,最后一位数取的不对。

private String getMacAddress(){
		String strMacAddr = null;
		try {
			InetAddress ip = getLocalInetAddress();

			byte[] b = NetworkInterface.getByInetAddress(ip)
					.getHardwareAddress();
			StringBuffer buffer = new StringBuffer();
			for (int i = 0; i < b.length; i++) {
				if (i != 0) {
					buffer.append(':');
				}

				String str = Integer.toHexString(b[i]&0xFF);
				buffer.append(str.length() == 1 ? 0 + str : str);
			}
			strMacAddr = buffer.toString().toUpperCase();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		AvcLog.printd("yttest", "strMacAddr:" + strMacAddr);

		String mac = getMac();
		AvcLog.printd("yttest" ,"mac:"+mac);
		return strMacAddr;
	}

	/**
	 * 获取移动设备本地IP
	 * @return
	 */
	protected static InetAddress getLocalInetAddress() {
		InetAddress ip = null;
		try {
			//列举
			Enumeration en_netInterface = NetworkInterface.getNetworkInterfaces();
			while (en_netInterface.hasMoreElements()) {//是否还有元素
				NetworkInterface ni = (NetworkInterface) en_netInterface.nextElement();//得到下一个元素
				Enumeration en_ip = ni.getInetAddresses();//得到一个ip地址的列举
				while (en_ip.hasMoreElements()) {
					ip = (InetAddress) en_ip.nextElement();
					if (!ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1)
						break;
					else
						ip = null;
				}

				if (ip != null) {
					break;
				}
			}
		} catch (SocketException e) {

			e.printStackTrace();
		}
		return ip;
	}



2.第二种方法


	//获取当前连接网络的网卡的mac地址
	private static String parseByte(byte b) {
		String s = "00" + Integer.toHexString(b)+":";
		return s.substring(s.length() - 3);
	}

	/**
	 * 获取当前系统连接网络的网卡的mac地址
	 * @return
	 */
	@SuppressLint("NewApi")
	public static final String getMac() {
		byte[] mac = null;
		StringBuffer sb = new StringBuffer();
		try {
			Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
			while (netInterfaces.hasMoreElements()) {
				NetworkInterface ni = netInterfaces.nextElement();
				Enumeration<InetAddress> address = ni.getInetAddresses();

				while (address.hasMoreElements()) {
					InetAddress ip = address.nextElement();
					if (ip.isAnyLocalAddress() || !(ip instanceof Inet4Address) || ip.isLoopbackAddress())
						continue;
					if (ip.isSiteLocalAddress())
						mac = ni.getHardwareAddress();
					else if (!ip.isLinkLocalAddress()) {
						mac = ni.getHardwareAddress();
						break;
					}
				}
			}
		} catch (SocketException e) {
			e.printStackTrace();
		}

		if(mac != null){
			for(int i=0 ;i<mac.length ;i++){
				sb.append(parseByte(mac[i]));
			}
			return sb.substring(0, sb.length()-1);
		}else {
			return null;
		}
	}

我的机器测试结果,进入adb shell ifconfig 查看系统数据,第一种方法获取的Mac地址较为准确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值