之前写了有些不够详细,现在贴上一些其他代码,仅供参考。
(1) 调用android 的API: NetworkInterface. getHardwareAddress ()
该API的level为9,只有android 2.3以上才有该接口
geMacFromInetAddress /** * 通过InetAddress获取mac地址 * @attention InetAddress * @return Mac Address */ private static String geMacFromInetAddress(Context context){ String mResult = null; try { for (Enumerationen = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(inetAddress.getHostAddress())) { Log.i(TAG_NETWORK,"get the ip address(inetAddress): "+inetAddress.getHostAddress().toString()); byte[] b = NetworkInterface.getByInetAddress(inetAddress).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); } mResult = buffer.toString().toUpperCase(); Log.i(TAG_NETWORK,"MAC address geMacFromInetAddress: "+mResult); return mResult; } } } } catch (SocketException ex) { Log.i(TAG_NETWORK,ex.toString()); } return null; }
AndroidManifest.xml
一般android不支持这两个命令。该方法没有试过。
(3) 调用Android的API: WifiManager
权限:
AndroidManifest.xml
代码:
getMacFromWifi /** * 通过wifiManager获取mac地址 * @attention Wifi * @return Mac Address */ private static String getMacFromWifi(Context context){ WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); if (!wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(true); } WifiInfo wifiInfo = wifiManager.getConnectionInfo(); String mResult = wifiInfo.getMacAddress(); Log.i(TAG_NETWORK,"Mac address(wifi): "+mResult); return mResult; }
这个是需要设备开通Wifi连接,获取到网卡的MAC地址
另,贴上,判断当前是否为wifi连接方式:
isWifiConnected //判断当前是否使用wifi连接 private static boolean isWifiConnected(Context context){ ConnectivityManager cm; cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); boolean result = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED ? true : false ; Log.i(TAG_NETWORK,"isWifiConnected: "+result); return result; }
(4) 调用Linux的busybox
getMacFromCallCmd /** * 通过callCmd("busybox ifconfig","HWaddr")获取mac地址 * @attention 需要设备装有busybox工具 * @return Mac Address */ private static String getMacFromCallCmd(){ String result = ""; result = callCmd("busybox ifconfig","HWaddr"); if(result == null || result.length() <= 0){ Log.i(TAG_NETWORK,"callCmd returns null or empty"); return null; } //对该行数据进行解析 //例如:eth0 Link encap:Ethernet HWaddr 00:16:E8:3E:DF:67 if(result.length()>0 && result.contains("HWaddr")==true){ String Mac = result.substring(result.indexOf("HWaddr")+6, result.length()-1); Log.i(TAG_NETWORK,"Mac:"+Mac+" Mac.length: "+Mac.length()); if(Mac.length()>1){ Mac = Mac.replaceAll(" ", ""); result = ""; String[] tmp = Mac.split(":"); for(int i = 0;i
其他相关函数:
callCmd 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; }
这个需要设备支持busybox工具。现在发现一些设备是没有安装该工具的,这时使用该方法,会报错。
(5)查询记录了MAC地址的文件“/proc/net/arp”
需要有这个文件,并且记录了相应的内容
getMacFromFile /** * get the Mac Address from the file /proc/net/arp * @param context * @attention the file /proc/net/arp need exit * @return Mac Address */ private static String getMacFromFile(Context context){ String mIP = Config.getIpAddress(context); if(mIP == null || mIP.length()<=0) return null; ListmResult = readFileLines("/proc/net/arp"); Log.d(TAG_NETWORK,"======= /proc/net/arp ========="); for(int i =0;i 1){ for(int j =1;j mList = new ArrayList (); String[] mType = mResult.get(j).split(" "); for(int i =0;i 0) mList.add(mType[i]); } if(mList!=null && mList.size()>4 && mList.get(0).equalsIgnoreCase(mIP)){ String result=""; String[] tmp = mList.get(3).split(":"); for(int i = 0;i
readFileLines /** * 以行为单位读取文件,常用于读面向行的格式化文件 */ private static ListreadFileLines(String fileName) { File file = new File(fileName); BufferedReader reader = null; String tempString =""; List mResult = new ArrayList (); try { Log.i("result","以行为单位读取文件内容,一次读一整行:"); reader = new BufferedReader(new FileReader(file)); while((tempString = reader.readLine())!=null){ mResult.add(tempString); } reader.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { } } } return mResult; }
记录了MAC地址的文件“/proc/net/arp”内容大致如下:
IP address HW type Flags HW address Mask Device
10.63.253.193 0x1 0x2 00:11:92:06:85:3f * eth010.63.253.194 0x1 0x2 00:11:92:06:85:3a * eth110.63.253.195 0x1 0x2 00:11:92:06:85:3b * eth2Done!!睡觉喽~