如何在Android中使用Python获取MAC地址
我正在安卓的XBMC Linux环境中编写一个插件。我可以在XBMC里看到MAC地址,但我想在插件中获取这个MAC地址,却不知道该怎么做。
mac=uuid.getnode()
我已经尝试过上面的代码,但每次在安卓上运行时只得到一些数字,而且每次都不一样。
有没有人能给我一些建议呢?
3 个回答
你可以用一种简单的方法来获取MAC地址,假设“eth0”是你的网络设备名称:
o = open('/sys/class/net/eth0/address', 'r')
mac_address = o.read().strip() #格式是“ff:ff:ff:ff:ff:ff”
如果你查看这个文档:
它会获取硬件地址,作为一个48位的正整数。第一次运行时,它可能会启动一个单独的程序,这个过程可能会比较慢。如果所有获取硬件地址的尝试都失败了,我们就会选择一个随机的48位数字,并把它的第八位设置为1,这样做是根据RFC 4122的建议。
第一部分解释了为什么它是“纯数字”。它本来就是应该是个数字。如果你想要以某种特定的十六进制字符串格式显示,只需格式化一下,比如调用hex()
函数。
最后一句话解释了为什么每次都“不同”。如果你查看源代码,在任何非Windows平台上,getnode
会先尝试_unixdll_getnode
,然后是_ifconfig_getnode
,最后如果都不行就退回到一个随机数字。前者需要一个叫uuid_generate_time
的函数,这个函数在libuuid
或libc
中,但在Android上不存在。后者会运行ifconfig
命令,带着一系列不同的参数,寻找特定的字符串,然后再退回到arp
和lanscan
。同样,这些在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发行版中没有直接暴露这些函数,所以你需要自己写一个封装。
你可以使用 XBMC 信息标签
if xbmc.getInfoLabel('Network.MacAddress') != None:
mac_address = xbmc.getInfoLabel('Network.MacAddress')
else:
mac_address = None