获取MAC地址的方法主要有如下四种方式
1、使用busybox ifconfig
2、使用cat /sys/class/net/wlan0/address
3、使用WifiInfo.getMacAddress
4、使用NetworkInterface.getHardwareAddress
第一种方法并不是所有的机器都装了busybox,所以,使用busybox的兼容性比较差。
public static String getMac_Busybox(){
String result = "";
String Mac = "";
result = exexCmd("busybox ifconfig","HWaddr");
if(result==null){
return "error";
}
if(result.length()>0 && result.contains("HWaddr")==true){
Mac = result.substring(result.indexOf("HWaddr")+6, result.length()-1);
result = Mac;
Log.i("test",result+" result.length: "+result.length());
}
return result;
}
private static String execCmd(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);
result = line;
}
catch(Exception e) {
e.printStackTrace();
}
return result;
}
第二种方法是通过读取网卡驱动提供的MAC地址信息,一般比较可靠,但是同busybox ifconfig或netcfg一样,需要手动解析返回的字符串。
public static String getMac_CAT() {
String str = "";
String macSerial = "";
try {
Process pp = Runtime.getRuntime().exec(
"cat /sys/class/net/wlan0/address ");
InputStreamReader ir = new InputStreamReader(pp.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
for (; null != str;) {
str = input.readLine();
if (str != null) {
macSerial = str.trim();
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
if (macSerial == null || "".equals(macSerial)) {
try {
return loadFileAsString("/sys/class/net/eth0/address")
.toUpperCase().substring(0, 17);
} catch (Exception e) {
e.printStackTrace();
}
}
return macSerial;
}
public static String loadFileAsString(String fileName) throws Exception {
FileReader reader = new FileReader(fileName);
String text = loadReaderAsString(reader);
reader.close();
return text;
}
public static String loadReaderAsString(Reader reader) throws Exception {
StringBuilder builder = new StringBuilder();
char[] buffer = new char[4096];
int readLength = reader.read(buffer);
while (readLength >= 0) {
builder.append(buffer, 0, readLength);
readLength = reader.read(buffer);
}
return builder.toString();
}
这种方法需要如下权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission ndroid:name="android.permission.ACCESS_COARSE_LOCATION" />
以上这种方法我在root的手机上是可以的,但是在华为的未root的上获取的mac为null。
第三种是通过WiFi来进行获取的,这种在WiFi关闭的情况下是获取不到的。
public static String getMac_WIFI(Context context){
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
return info.getMacAddress();
}
第四种其原理和cat /sys/class/net/wlan0/address是一模一样的,但是这个是上层API,不需要自己处理底层数据。在Android 6.0上测试通过。
public static String getMac_NET() {
try {
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif : all) {
if (!nif.getName().equalsIgnoreCase("wlan0")) {
continue;
}
byte[] macBytes = nif.getHardwareAddress();
if (macBytes == null) {
return "";
}
StringBuilder res1 = new StringBuilder();
for (byte b : macBytes) {
res1.append(String.format("%02X:", b));
}
if (res1.length() > 0) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString();
}
} catch (Exception ex) {
}
return "02:00:00:00:00:00";
}
结合自己实际的开发经验以及网上一些大牛的帖子,获取基本上就这四种方法,如果各位读者有更好的方法方式欢迎提出补充,共同学习。
网友评论