• (转)【Android】获取Mac地址【2】


    之前写了【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!!睡觉喽~

    作者:风倾清凌
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    在 kylin-v10环境中搭建 electron
    二叉树建树
    python 从txt文件中提取数据保存到 xlxs 文件中
    openpyxl 插件写入数据
    python时间格式转换
    vue-typescript-element-template使用总结
    vue3入门
    typescript入门
    记录下谷歌 浏览器请求数据时遇302,重新连接的问题
    uni使用render.js视图层与逻辑层传数据 的问题
  • 原文地址:https://www.cnblogs.com/antyi/p/4126119.html
Copyright © 2020-2023  润新知