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();//得到下一个元素
Enumerationen_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(Enumerationen=NetworkInterface
.getNetworkInterfaces();en.hasMoreElements();){
NetworkInterfaceintf=en.nextElement();
for(EnumerationenumIpAddr=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。