android mac地址错误,Android mac地址获取的方法小结及可能出现的问题

这段时间项目遇到个问题,客户把移动设备回厂修理后再安装我们的项目,运行会报错。后来经过我仔细排查发现一个很诡异的问题,就是无法获取mac地址了。于是我仔细把获取mac地址的一些资料看了看,加上一些调试,总算是解决了这个问题。现在决定把这块小结下,以免再次遇到问题。

mac地址又称为物理地址,和ip地址不同的是,mac地址由网卡决定,也就是一个设备只能有一个mac地址,所以经常作为唯一标识码来使用。我在网上找了下,总共找到四中获取mac地址的方法。

1.通过wifimaneger来获取

wifimaneger是Android里对wifi的管理器,可以通过它查询到网卡状态,无线信号列表,当前网络,连接ip,以及mac地址等。这是目前比较常见的一种,我用手机试了下,发现这个方法在手机刚开机时候是没用的,如图所示:

0818b9ca8b590ca3270a3433284dd417.png

当我打开了wifi(即使不连)以后,就可以获取到正常的mac地址了,如图所示:

0818b9ca8b590ca3270a3433284dd417.png

然后我发现,其实这个wifimaneger里获取的就和手机里的高级wlan里显示的一样,获取的mac地址或者是ip地址,如图所示:

0818b9ca8b590ca3270a3433284dd417.png

代码为:

mWifiManager= (WifiManager) context

.getSystemService(Context.WIFI_SERVICE);mWifiInfo= mWifiManager.getConnectionInfo();

String mScanResult = mWifiAdmin.getMacAddress();

总结下就是:wifimaneger获取mac必须是打开wifi设置过一次(之后关闭也没事),之后就会正常获取到mac。我想可能是打开wifi设置就会查询网卡信息,获取到mac的值,并记录下来。

2.通过linux底层的方法获取

这个也是比较常见的方法,android 底层是 Linux,我们用Linux的方法肯定能获取的,具体代码如下:

public staticString getLocalMacAddress() {

String macSerial = null;String str = "";try{

Process pp = Runtime.getRuntime().exec(

"cat /sys/class/net/wlan0/address ");InputStreamReader ir = newInputStreamReader(pp.getInputStream());LineNumberReader input = newLineNumberReader(ir);for(; null!= str;) {

str = input.readLine();if(str != null) {

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

}

} catch(IOException ex) {

// 赋予默认值ex.printStackTrace();}

returnmacSerial;     这个效果图我就不贴了,

总结一下就是必须把wifi按钮打开,即使不连也行,当wifi关闭时候无法获取到mac地址。

具体原理参考:http://www.tuicool.com/articles/ameQJfN 这位大神的文章。

3.通过busybox,cmd获取,具体代码如下:

result = GetMac_3.callCmd("busybox ifconfig","HWaddr");

public staticString callCmd(String cmd,String filter) {

String result = "";String line = "";try{

Process proc = Runtime.getRuntime().exec(cmd);InputStreamReader is = newInputStreamReader(proc.getInputStream());BufferedReader br = newBufferedReader(is);//执行命令cmd,只取结果中含有filter的这一行while((line = br.readLine ()) != null&& line.contains(filter)== false) {

//result += line;Log.i("test","line: "+line);}

result = line;Log.i("test","result: "+result);}

catch(Exception e) {

e.printStackTrace();}

returnresult;

第四种是根据IP获取本地mac

public staticString getLocalMacAddressFromIp(Context context) {

String mac_s= "";try{

byte[] mac;NetworkInterface ne=NetworkInterface.getByInetAddress(InetAddress.getByName(getLocalIpAddress()));mac = ne.getHardwareAddress();mac_s = byte2hex(mac);} catch(Exception e) {

e.printStackTrace();}

returnmac_s;

实话来说,第三和第四的方法我都没获取到mac。但是网上很多都提到了这两种方法,所以特地写出来供参考。

比如这篇就提到了http://blog.csdn.net/crazyman2010/article/details/50464256

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值