android从底层获取mac地址的方法
在android上层获取mac有时候会出现获取不到的问题,是因为有些固件厂商改写了底层,我们再去调用framework层代码,就会出现获取不到的问题,为了避免此问题,这里做了一个小小的记录.下次遇到这种问题,便于解决问题.
android 系统和linux很像,那他是不是和linux系统一样有个存放网卡信息的文件呢,答案是有.在根目录下/proc/net/dev
文件就是包含了网卡的所有信息,现在我把他导出来看一下.截图如下:
会发现这里只有eth0,无线网卡去哪里了呢.让我断开有线连接,连上无线再看一下.截图如下:
这时候我没看见了我们的无线网卡了,是wlan0,
如果有多张网卡,就会是eth1,eth2,这样排序.到了这里你会说,mac地址在那里啊,不要着急,听我慢慢解释,
我们获取到的eth0,wlan0这些值之后,我们就可以去读取/sys/class/net/%s/address这个文件,把%s替换成eth0这些值就行.我们以eth0为例.看一下文件截图.
看见了啥,我们就这样获取到了真实的mac地址,其实framework层的代码原理也是这样获取的.想要了解的可以看一下这个链接地址:https://www.tuicool.com/articles/ameQJfN
获取代码如下:
readMacFilePath("/proc/net/dev");
public String readMacFilePath(String filename){ List<String> strings = new ArrayList<>(); FileInputStream in = null; String mac = ""; BufferedReader bufReader = null; InputStreamReader inReader = null; try { in = new FileInputStream(filename); inReader = new InputStreamReader(in, "UTF-8"); bufReader = new BufferedReader(inReader); String line = null; int i = 1; while((line = bufReader.readLine()) != null){ Log.d(TAG,"readMacFilePath line " + i + line.trim()); String[] s = line.split(":"); for (int j = 0; j<s.length; j++){ if (s[j].contains("eth")||s[j].contains("wlan")){ strings.add(s[j].trim()); } } i++; } Collections.sort(strings); Log.d(TAG,"readMacFilePath sort strings is " + strings.toString()); for (String string : strings){ mac = getMac("/sys/class/net/"+string + "/address"); if (!TextUtils.isEmpty(mac)){ return mac; } } } catch (Exception e) { e.printStackTrace(); Log.d(TAG,"readMacFilePath e is "+ e.getMessage()); }finally { try { if (in!=null){ in.close(); } if (bufReader!=null){ bufReader.close(); } if (inReader!=null){ inReader.close(); } } catch (IOException e) { e.printStackTrace(); } } Log.d(TAG,"readMacFilePath mac is " + mac); return mac; }
public String getMac(String filename){ String mac = null; try { FileInputStream in = new FileInputStream(filename); InputStreamReader inReader = new InputStreamReader(in, "UTF-8"); BufferedReader bufReader = new BufferedReader(inReader); int i = 1; String line; while((line = bufReader.readLine()) != null){ Log.d(TAG,"in getMac line " + i + line.trim()); mac = line; i++; } bufReader.close(); inReader.close(); in.close(); } catch (Exception e) { e.printStackTrace(); Log.d(TAG,"in getMac" + filename + "error " + e.getMessage()); } Log.d(TAG,"in getMac mac is " + mac); return mac; }当读到mac地址不为空就返回.