Android开发获取手机Mac地址适配所有Android版本
最近由于项目需要MAC地址的记录,搞了一个通用的适配类,目前经过测试可以适配Android所有版本,我测试过的设备系统Android45677+都可以获取到,废话不多说直接上代码,简洁:
该类分为三类:Android6.0以下、6.0以上7.0以下、7.0以上
首先是获取MAC的整合方法:
publicstaticStringgetMac(Contextcontext){ StringstrMac=null; if(Build.VERSION.SDK_INT=Build.VERSION_CODES.M){ Log.e("=====","6.0以上7.0以下"); Toast.makeText(context,"6.0以上7.0以下",Toast.LENGTH_SHORT).show(); strMac=getMacAddress(context); returnstrMac; }elseif(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){ Log.e("=====","7.0以上"); if(!TextUtils.isEmpty(getMacAddress())){ Log.e("=====","7.0以上1"); Toast.makeText(context,"7.0以上1",Toast.LENGTH_SHORT).show(); strMac=getMacAddress(); returnstrMac; }elseif(!TextUtils.isEmpty(getMachineHardwareAddress())){ Log.e("=====","7.0以上2"); Toast.makeText(context,"7.0以上2",Toast.LENGTH_SHORT).show(); strMac=getMachineHardwareAddress(); returnstrMac; }else{ Log.e("=====","7.0以上3"); Toast.makeText(context,"7.0以上3",Toast.LENGTH_SHORT).show(); strMac=getLocalMacAddressFromBusybox(); returnstrMac; } } return"02:00:00:00:00:00"; }
6.0以下方法,Google提供的公有方法,需要权限
/** *根据wifi信息获取本地mac *@paramcontext *@return */ publicstaticStringgetLocalMacAddressFromWifiInfo(Contextcontext){ WifiManagerwifi=(WifiManager)context.getSystemService(Context.WIFI_SERVICE); WifiInfowinfo=wifi.getConnectionInfo(); Stringmac=winfo.getMacAddress(); returnmac; }
android6.0及以上、7.0以下
android6.0以后将不再能通过wifimanager获取mac,获取到的mac将是固定的:02:00:00:00:00:00。
然而我开发的sdk就是通过wifimanager获取的mac。
androidsdk后来做了6.0适配,通过cat/sys/class/net/wlan0/address,可以在6.0上获取mac地址。
/** *android6.0及以上、7.0以下获取mac地址 * *@paramcontext *@return */ publicstaticStringgetMacAddress(Contextcontext){ //如果是6.0以下,直接通过wifimanager获取 if(Build.VERSION.SDK_INT"+"NetInfoManager","getMacAddress:"+ex.toString()); } if(macSerial==null||"".equals(macSerial)){ try{ returnloadFileAsString("/sys/class/net/eth0/address") .toUpperCase().substring(0,17); }catch(Exceptione){ e.printStackTrace(); Log.e("----->"+"NetInfoManager", "getMacAddress:"+e.toString()); } } returnmacSerial; } privatestaticStringgetMacAddress0(Contextcontext){ if(isAccessWifiStateAuthorized(context)){ WifiManagerwifiMgr=(WifiManager)context .getSystemService(Context.WIFI_SERVICE); WifiInfowifiInfo=null; try{ wifiInfo=wifiMgr.getConnectionInfo(); returnwifiInfo.getMacAddress(); }catch(Exceptione){ Log.e("----->"+"NetInfoManager", "getMacAddress0:"+e.toString()); } } return""; } /** *Checkwhetheraccessingwifistateispermitted * *@paramcontext *@return */ privatestaticbooleanisAccessWifiStateAuthorized(Contextcontext){ if(PackageManager.PERMISSION_GRANTED==context .checkCallingOrSelfPermission("android.permission.ACCESS_WIFI_STATE")){ Log.e("----->"+"NetInfoManager","isAccessWifiStateAuthorized:" +"accesswifistateisenabled"); returntrue; }else returnfalse; } privatestaticStringloadFileAsString(StringfileName)throwsException{ FileReaderreader=newFileReader(fileName); Stringtext=loadReaderAsString(reader); reader.close(); returntext; } privatestaticStringloadReaderAsString(Readerreader)throwsException{ StringBuilderbuilder=newStringBuilder(); char[]buffer=newchar[4096]; intreadLength=reader.read(buffer); while(readLength>=0){ builder.append(buffer,0,readLength); readLength=reader.read(buffer); } returnbuilder.toString(); }
android7.0及以上
android7.0后,通过上述适配的方法,将获取不到mac地址。
经过调研和测试,7.0上仍有办法回去mac地址:
总共分为三种方式:
- 通过ip地址来获取绑定的mac地址
- 扫描各个网络接口获取mac地址
- 通过busybox获取本地存储的mac地址
代码如下:
/** *根据IP地址获取MAC地址 * *@return */ publicstaticStringgetMacAddress(){ StringstrMacAddr=null; try{ //获得IpD地址 InetAddressip=getLocalInetAddress(); byte[]b=NetworkInterface.getByInetAddress(ip) .getHardwareAddress(); StringBufferbuffer=newStringBuffer(); for(inti=0;ien_netInterface=NetworkInterface .getNetworkInterfaces(); while(en_netInterface.hasMoreElements()){//是否还有元素 NetworkInterfaceni=(NetworkInterface)en_netInterface .nextElement();//得到下一个元素 Enumeration en_ip=ni.getInetAddresses();//得到一个ip地址的列举 while(en_ip.hasMoreElements()){ ip=en_ip.nextElement(); if(!ip.isLoopbackAddress() &&ip.getHostAddress().indexOf(":")==-1) break; else ip=null; } if(ip!=null){ break; } } }catch(SocketExceptione){ e.printStackTrace(); } returnip; } /** *获取本地IP * *@return */ privatestaticStringgetLocalIpAddress(){ try{ for(Enumeration en=NetworkInterface .getNetworkInterfaces();en.hasMoreElements();){ NetworkInterfaceintf=en.nextElement(); for(Enumeration enumIpAddr=intf .getInetAddresses();enumIpAddr.hasMoreElements();){ InetAddressinetAddress=enumIpAddr.nextElement(); if(!inetAddress.isLoopbackAddress()){ returninetAddress.getHostAddress().toString(); } } } }catch(SocketExceptionex){ ex.printStackTrace(); } returnnull; }
/** *android7.0及以上(2)扫描各个网络接口获取mac地址 * */ /** *获取设备HardwareAddress地址 * *@return */ publicstaticStringgetMachineHardwareAddress(){ Enumerationinterfaces=null; try{ interfaces=NetworkInterface.getNetworkInterfaces(); }catch(SocketExceptione){ e.printStackTrace(); } StringhardWareAddress=null; NetworkInterfaceiF=null; if(interfaces==null){ returnnull; } while(interfaces.hasMoreElements()){ iF=interfaces.nextElement(); try{ hardWareAddress=bytesToString(iF.getHardwareAddress()); if(hardWareAddress!=null) break; }catch(SocketExceptione){ e.printStackTrace(); } } returnhardWareAddress; } /*** *byte转为String * *@parambytes *@return */ privatestaticStringbytesToString(byte[]bytes){ if(bytes==null||bytes.length==0){ returnnull; } StringBuilderbuf=newStringBuilder(); for(byteb:bytes){ buf.append(String.format("%02X:",b)); } if(buf.length()>0){ buf.deleteCharAt(buf.length()-1); } returnbuf.toString(); }
/** *android7.0及以上(3)通过busybox获取本地存储的mac地址 * */ /** *根据busybox获取本地Mac * *@return */ publicstaticStringgetLocalMacAddressFromBusybox(){ Stringresult=""; StringMac=""; result=callCmd("busyboxifconfig","HWaddr"); //如果返回的result==null,则说明网络不可取 if(result==null){ return"网络异常"; } //对该行数据进行解析 //例如:eth0Linkencap:EthernetHWaddr00:16:E8:3E:DF:67 if(result.length()>0&&result.contains("HWaddr")==true){ Mac=result.substring(result.indexOf("HWaddr")+6, result.length()-1); result=Mac; } returnresult; } privatestaticStringcallCmd(Stringcmd,Stringfilter){ Stringresult=""; Stringline=""; try{ Processproc=Runtime.getRuntime().exec(cmd); InputStreamReaderis=newInputStreamReader(proc.getInputStream()); BufferedReaderbr=newBufferedReader(is); while((line=br.readLine())!=null &&line.contains(filter)==false){ result+=line; } result=line; }catch(Exceptione){ e.printStackTrace(); } returnresult; }
本文主要讲解了Android获取手机Mac地址的实例源码,更多关于Android获取手机Mac地址的技巧请查看下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。