java如何获得wlan mac_Android M 如何获取 Wifi MAC地址

今天在撸代码时发现,之前能获取mac地址的方法在nexus 6上返回了“02:00:00:00:00:00”,进入设置查看mac地址,结果不相同,肯定有问题,于是就开始上网查资料一探究竟。

原先获取mac地址的代码段:

a62ff95d8e17

6.0之前获取mac地址方法

对于在Android Mashmallow返回地址“02:00:00:00:00:00”,官方其实是有说明的:“保护用户隐私数据”。

a62ff95d8e17

android 官方说明

然后就找到了这篇文章,里面详细的介绍了一种方法获取。用Java获取设备网络设备信息的API——NetworkInterface.getNetworkInterfaces()——仍然可以间接地获取到MAC地址。

a62ff95d8e17

NetworkInterface.getNetworkInterfaces

注意:在使用上述代码时,记得添加以下权限:

a62ff95d8e17

使用NetworkInterface.getNetworkInterfaces在手机上的输出结果为:

a62ff95d8e17

猜想wlan0对应的mac地址应该就是我们要找的。既然NetworkInterface可以正常获取,那得好好看看它在 Android framework 中的实现源码:

a62ff95d8e17

原来MAC地址是直接从"/sys/class/net/" + name + "/address"文件中读取的!

这个name是什么呢?

继续翻源码:

a62ff95d8e17

a62ff95d8e17

可以看出/sys/class/net目录下的一个文件夹即对应一个NetworkInterface的name。

a62ff95d8e17

从路由器上在线设备的MAC地址列表,可以验证我这台设备Wifi的name是wlan0

那么读取文件/sys/class/net/wlan0/address就轻松得到了这台设备的MAC地址:

a62ff95d8e17

不出所料!

进而,问题又变成如何获取设备的Wifi的interface name?

回到开头,我们是通过context.getSystemService(Context.WIFI_SERVICE)获取的WifiManager。而WifiManager肯定是与远程系统服务的IBinder在交互,而系统服务都是在SystemServer.run()中被启动的。在SystemServer.java中搜索关键字”WIFI_SERVICE”,很容易便找到mSystemServiceManager.startService(WIFI_SERVICE_CLASS);顺藤摸瓜,又找到系统服务实现类com.android.server.wifi.WifiService,WifiService中的逻辑很简单,构造真正的实现类com.android.server.wifi.WifiServiceImpl对象并注册到系统服务中:

a62ff95d8e17

WifiService.java

打开WifiServiceImpl.java,从构造方法处,一眼就看到了关键代码:mInterfaceName = SystemProperties.get("wifi.interface", "wlan0");

a62ff95d8e17

如此这般终于找到定义设备的Wifi的interface name的地方:SystemProperties

通过adb可以很容易得到这个属性值:adb shell getprop wifi.interface

那么在我们应用里可以通过Java的反射获取SystemProperties,进而调用静态方法get即可拿到Wifi的interface name。

如果是系统应用,可以直接添加下面的权限,之前的方法仍旧可以返回正确的mac地址:

a62ff95d8e17

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值