android 获取网卡mac_Android 获取mac地址

由于项目开发需要获取设备的mac地址,因此查阅了Android获取mac地址相关信息,本篇博客转载自《Android获取Mac地址-适配所有版本》,并在此基础上进行进一步整理。

根据Android版本,可将Android获取mac的方法分为三类: Android 6.0以下,Android 6.0以上、7.0以下, Android 7.0以上。

1. Android 6.0以下

在Android 6.0以下,首先需要获取如下权限:

获取mac地址的方法如下:

/**

* Android 6.0 之前(不包括6.0)获取mac地址

* 必须的权限

* @param context * @return

*/

public static String getMacDefault(Context context) {

String mac = "";

if (context == null) {

return mac;

}

WifiManager wifi = (WifiManager)context.applicationContext.getSystemService(Context.WIFI_SERVICE);

WifiInfo info = null;

try {

info = wifi.getConnectionInfo();

} catch (Exception e) {

e.printStackTrace();

}

if (info == null) {

return null;

}

mac = info.getMacAddress();

if (!TextUtils.isEmpty(mac)) {

mac = mac.toUpperCase(Locale.ENGLISH);

}

return mac;

}

2.Android 6.0以上、7.0以下

android 6.0以后 将不再能通过 wifimanager 获取mac,获取到的mac将是固定的:02:00:00:00:00:00 。android sdk后来做了6.0适配,通过cat /sys/class/net/wlan0/address,可以在6.0上获取mac地址。

获取mac地址的方法如下:

/**

* Android 6.0-Android 7.0 获取mac地址

*/

public static String getMacAddress() {

String macSerial = null;

String str = "";

try {

Process pp = Runtime.getRuntime().exec("cat/sys/class/net/wlan0/address");

InputStreamReader ir = new InputStreamReader(pp.getInputStream());

LineNumberReader input = new LineNumberReader(ir);

while (null != str) {

str = input.readLine();

if (str != null) {

macSerial = str.trim();//去空格

break;

}

}

} catch (IOException ex) {

// 赋予默认值

ex.printStackTrace();

}

return macSerial;

}

3.Android 7.0以上

android 7.0 后,通过上述适配的方法,将获取不到mac地址。

经过调研和测试,7.0上仍有办法获取mac地址:

总共分为三种方式:

(1)通过ip地址来获取绑定的mac地址

(2)扫描各个网络接口获取mac地址

(3)通过busybox获取本地存储的mac地址

以下为通过(2)方法获取mac地址,其他方法请参考原博客:

/**

* Android 7.0之后获取Mac地址

* 遍历循环所有的网络接口,找到接口是 wlan0

* 必须的权限

* @return

*/

public static String getMacFromHardware() {

try {

Enumeration all =

Collections.list(NetworkInterface.getNetworkInterfaces());

for (NetworkInterface nif : all) {

if (!nif.name.equals("wlan0", ignoreCase = true))

continue;

Byte macBytes[] = nif.getHardwareAddress()

if (macBytes == null) return ""

StringBuilder res1 = new StringBuilder();

for (Byte b : macBytes) {

res1.append(String.format("%02X:", b))

}

if (!TextUtils.isEmpty(res1)) {

res1.deleteCharAt(res1.length - 1)

}

return res1.toString()

}

} catch (e: Exception) {

e.printStackTrace()

}

return ""

}

最后,将三个方法整合,就能适配所有Android版本了:

/**

* 获取mac地址(适配所有Android版本)

* @return

*/

fun getMac(context: Context): String? {

String mac: String? = ""

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {

mac = getMacDefault(context)

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {

mac = getMacAddress()

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

mac = getMacFromHardware()

}

return mac

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值