如何在Android中使用Python获取MAC地址

2 投票
3 回答
2223 浏览
提问于 2025-04-17 14:22

我正在安卓的XBMC Linux环境中编写一个插件。我可以在XBMC里看到MAC地址,但我想在插件中获取这个MAC地址,却不知道该怎么做。

mac=uuid.getnode()

我已经尝试过上面的代码,但每次在安卓上运行时只得到一些数字,而且每次都不一样。

有没有人能给我一些建议呢?

3 个回答

0

你可以用一种简单的方法来获取MAC地址,假设“eth0”是你的网络设备名称:

o = open('/sys/class/net/eth0/address', 'r')

mac_address = o.read().strip() #格式是“ff:ff:ff:ff:ff:ff”

3

如果你查看这个文档

它会获取硬件地址,作为一个48位的正整数。第一次运行时,它可能会启动一个单独的程序,这个过程可能会比较慢。如果所有获取硬件地址的尝试都失败了,我们就会选择一个随机的48位数字,并把它的第八位设置为1,这样做是根据RFC 4122的建议。

第一部分解释了为什么它是“纯数字”。它本来就是应该是个数字。如果你想要以某种特定的十六进制字符串格式显示,只需格式化一下,比如调用hex()函数。

最后一句话解释了为什么每次都“不同”。如果你查看源代码,在任何非Windows平台上,getnode会先尝试_unixdll_getnode,然后是_ifconfig_getnode,最后如果都不行就退回到一个随机数字。前者需要一个叫uuid_generate_time的函数,这个函数在libuuidlibc中,但在Android上不存在。后者会运行ifconfig命令,带着一系列不同的参数,寻找特定的字符串,然后再退回到arplanscan。同样,这些在Android上都不管用。

在Android上没有推荐的方法来获取MAC地址,主要是因为他们不希望你获取这个地址。这篇博客文章解释了原因,而这个StackOverflow的问题(特别是Seka Alekseyev的回答)提供了更多细节。有些应用在获取到MAC地址后会保存下来,不再检查,这样可以绕过一些问题,但大部分问题还是存在。

有一个Java API可以获取每个服务的MAC地址,比如WiFi、3G、蓝牙等。你需要自己决定哪个是“真正的”MAC地址,并且需要正确的权限(例如,android.permission.ACCESS_WIFI_STATE),有时可能没有值或者值是垃圾数据,但你可以用下面的代码获取:

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
String mac = wm.getConnectionInfo().getMacAddress();

据我所知,SL4A或其他任何Android Python发行版中没有直接暴露这些函数,所以你需要自己写一个封装。

3

你可以使用 XBMC 信息标签

if xbmc.getInfoLabel('Network.MacAddress') != None:
    mac_address = xbmc.getInfoLabel('Network.MacAddress')
else:
    mac_address = None

撰写回答