之前写了【Android】获取Mac地址【1】有些不够详细,现在贴上一些其他代码,仅供参考。

(1) 调用android 的API: NetworkInterface. getHardwareAddress ()

该API的level为9,只有android 2.3以上才有该接口

(2) 调用java 的方法: nbtstat/arp

一般android不支持这两个命令。该方法没有试过。

(3) 调用Android的API: WifiManager

权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>

代码:

	/**
* 通过wifiManager获取mac地址
* @attention Wifi
* @return Mac Address
*/
private static String getMacFromWifi(Context context){
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
}
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String mResult = wifiInfo.getMacAddress();
Log.i(TAG_NETWORK,"Mac address(wifi): "+mResult);
return mResult;
}

这个是需要设备开通Wifi连接,获取到网卡的MAC地址

另,贴上,判断当前是否为wifi连接方式:

    //判断当前是否使用wifi连接
private static boolean isWifiConnected(Context context){
ConnectivityManager cm;
cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
boolean result = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED ? true : false ; Log.i(TAG_NETWORK,"isWifiConnected: "+result);
return result;
}

(4) 调用Linux的busybox

	/**
* 通过callCmd("busybox ifconfig","HWaddr")获取mac地址
* @attention 需要设备装有busybox工具
* @return Mac Address
*/
private static String getMacFromCallCmd(){
String result = "";
result = callCmd("busybox ifconfig","HWaddr"); if(result == null || result.length() <= 0){
Log.i(TAG_NETWORK,"callCmd returns null or empty");
return null;
} //对该行数据进行解析
//例如:eth0 Link encap:Ethernet HWaddr 00:16:E8:3E:DF:67
if(result.length()>0 && result.contains("HWaddr")==true){
String Mac = result.substring(result.indexOf("HWaddr")+6, result.length()-1);
Log.i(TAG_NETWORK,"Mac:"+Mac+" Mac.length: "+Mac.length());
if(Mac.length()>1){
Mac = Mac.replaceAll(" ", "");
result = ""; String[] tmp = Mac.split(":");
for(int i = 0;i<tmp.length;++i){
result +=tmp[i];
}
} Log.i(TAG_NETWORK,result+" result.length: "+result.length());
}
Log.i(TAG_NETWORK,"Mac address(CallCmd): "+result); return result;
}

其他相关函数:

   public static String callCmd(String cmd,String filter) {
String result = "";
String line = "";
try {
Process proc = Runtime.getRuntime().exec(cmd);
InputStreamReader is = new InputStreamReader(proc.getInputStream());
BufferedReader br = new BufferedReader (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();
}
return result;
}

这个需要设备支持busybox工具。现在发现一些设备是没有安装该工具的,这时使用该方法,会报错。

(5)查询记录了MAC地址的文件“/proc/net/arp”

需要有这个文件,并且记录了相应的内容

   /**
* get the Mac Address from the file /proc/net/arp
* @param context
* @attention the file /proc/net/arp need exit
* @return Mac Address
*/
private static String getMacFromFile(Context context){
String mIP = Config.getIpAddress(context);
if(mIP == null || mIP.length()<=0)
return null; List<String> mResult = readFileLines("/proc/net/arp"); Log.d(TAG_NETWORK,"======= /proc/net/arp =========");
for(int i =0;i<mResult.size();++i)
Log.d("line",mResult.get(i));
Log.d(TAG_NETWORK,"==========================="); if(mResult !=null && mResult.size()>1){
for(int j =1;j<mResult.size();++j){
List<String> mList = new ArrayList<String>();
String[] mType = mResult.get(j).split(" ");
for(int i =0;i<mType.length;++i){
if(mType[i]!=null && mType[i].length()>0)
mList.add(mType[i]);
} if(mList!=null && mList.size()>4 && mList.get(0).equalsIgnoreCase(mIP)){
String result="";
String[] tmp = mList.get(3).split(":");
for(int i = 0;i<tmp.length;++i){
result +=tmp[i];
}
result = result.toUpperCase();
Log.i(TAG_NETWORK,"Mac address(file): "+result);
return result;
}
}
}
return null;
}

	 /**
* 以行为单位读取文件,常用于读面向行的格式化文件
*/
private static List<String> readFileLines(String fileName) {
File file = new File(fileName);
BufferedReader reader = null;
String tempString ="";
List<String> mResult = new ArrayList<String>();
try {
Log.i("result","以行为单位读取文件内容,一次读一整行:");
reader = new BufferedReader(new FileReader(file));
while((tempString = reader.readLine())!=null){
mResult.add(tempString);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
} return mResult;
}

记录了MAC地址的文件“/proc/net/arp”内容大致如下:

IP address       HW type     Flags       HW address            Mask     Device
10.63.253.193    0x1         0x2         00:11:92:06:85:3f     *        eth0
10.63.253.194    0x1         0x2         00:11:92:06:85:3a     *        eth1
10.63.253.195    0x1         0x2         00:11:92:06:85:3b     *        eth2

Done!!睡觉喽~

作者:风倾清凌
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

(转)【Android】获取Mac地址【2】的更多相关文章

  1. android获取Mac地址和IP地址

    获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信 ...

  2. android获取mac地址方法

    http://www.cnblogs.com/xioapingguo/p/4037513.html 网上找的,记录一下 public static String getMacAdress(){ Wif ...

  3. Android获取蓝牙地址

    最近做一个项目,发现Android6.0以上的版本获取的蓝牙地址始终为02:00:00:00, Google一下发现Android早就封掉了相关接口,于是想到反射的方式去获取Mac地址,在此记录一下 ...

  4. php怎么获取mac地址?

    如何用php获取mac地址呢?大家知道mac地址是电脑在全球范围的唯一标识,所以这个就非常实用,比如说要做一个投票功能,那mac地址是必不可少 的,如果单纯的靠ip地址来判断这个肯定是不准确的,水分太 ...

  5. C# 获取MAC地址

    /********************************************************************** * C# 获取MAC地址 * 说明: * 在C#中获取本 ...

  6. c++ windows 获取mac地址

    c++ windows 获取mac地址 GetAdaptersInfo 用windows api获取mac地址和硬盘id编号 aa

  7. python 获取 mac 地址 的代码

    python 获取 mac 地址 的例子,有需要的朋友可以参考下. #!/bin/python import os import re def GetMac():     if os.name ==  ...

  8. Java根据ip地址获取Mac地址,Java获取Mac地址

    Java根据ip地址获取Mac地址,Java获取Mac地址 >>>>>>>>>>>>>>>>>&g ...

  9. js 获取mac地址

    js 获取mac地址 function MacInfo(){ var locator =new ActiveXObject ("WbemScripting.SWbemLocator" ...

随机推荐

  1. 初入Spring-boot(二)

    一.入口类 Spring boot通常有一个名为*Application的入口类,入口类里有一个main方法,这个main方法其实就是一个标准的java应用的入口方法.在main方法中使用Spring ...

  2. var与this定义变量的区别以及疑惑

    我们知道: var可以定义一个局部变量,当然如果var定义在最外层的话,就是全局的局部变量,也就算是全局变量了. 而this关键字定义的变量准确的说应该算是成员变量.即定义的是调用对象的成员变量. 另 ...

  3. Redis_01

    http://redis.io/ http://www.yiibai.com/redis/redis_quick_guide.html X

  4. [转]类不平衡问题与SMOTE过采样算法

    在前段时间做本科毕业设计的时候,遇到了各个类别的样本量分布不均的问题——某些类别的样本数量极多,而有些类别的样本数量极少,也就是所谓的类不平衡(class-imbalance)问题. 本篇简述了以下内 ...

  5. mysql数据库优化课程---6、mysql结构化查询语言有哪些

    mysql数据库优化课程---6.mysql结构化查询语言有哪些 一.总结 一句话总结:主要分为四类 1.DCL 数据控制语言1)grant2)commit3)rollback 2.DDL 数据定义语 ...

  6. .SourceInsight添加.S文件

    在Option->Document Option添加配置.S然后再去添加文件

  7. Hibernate 悲观锁,乐观锁

    业务逻辑的实现过程中,往往需要保证数据访问的排他性.因此,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的“锁”,即给我们选定的目标数据上锁,使其无 ...

  8. Django的 CBV和FBV

    FBV CBV 回顾多重继承和Mixin 回到顶部 FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以 ...

  9. SpringMVC中WebDataBinder的应用及原理

     Controller方法的参数类型可以是基本类型,也可以是封装后的普通Java类型.若这个普通Java类型没有声明任何注解,则意味着它的每一个属性都需要到Request中去查找对应的请求参数.众所周 ...

  10. http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html深入理解Java:SimpleDateFormat安全的时间格式化

    http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html