Android获取MAC地址

本文介绍了在Android中获取设备MAC地址的多种方法,包括调用Android API、使用busybox命令、读取特定文件等,并提供了详细的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

geMacFromInetAddress	/**
	 * 通过InetAddress获取mac地址
	 * @attention InetAddress
	 * @return Mac Address
	 */
	private static String geMacFromInetAddress(Context context){
		String mResult = null;
		try {   
	          for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {   
	               NetworkInterface intf = en.nextElement(); 
	                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {   
	                   InetAddress inetAddress = enumIpAddr.nextElement();
	                    if (!inetAddress.isLoopbackAddress()  && InetAddressUtils.isIPv4Address(inetAddress.getHostAddress())) {   
	                    	Log.i(TAG_NETWORK,"get the ip address(inetAddress): "+inetAddress.getHostAddress().toString());
	                        
	                    	byte[] b = NetworkInterface.getByInetAddress(inetAddress).getHardwareAddress();  
	                    	StringBuffer buffer = new StringBuffer();  
	                    	for (int i = 0; i < b.length; i++) {  
//	           	            if (i != 0) {  
//	           	                buffer.append('-');  
//	           	            }  
	           	  
	           	            String str = Integer.toHexString(b[i] & 0xFF);  
	           	            buffer.append(str.length() == 1 ? 0 + str : str);  
	           	        }  
	           	        mResult = buffer.toString().toUpperCase();  
	           	        Log.i(TAG_NETWORK,"MAC address geMacFromInetAddress: "+mResult);
	                    return mResult; 
	                    }  
	                }  
	            }
	        } catch (SocketException ex) {
	        	Log.i(TAG_NETWORK,ex.toString());
	        }
		return null;
	}

 

AndroidManifest.xml    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="9" />


(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

 

http://www.cnblogs.com/Amandaliu/archive/2012/12/04/2802322.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3444738.html

Android应用程序中获取设备的MAC地址通常涉及网络信息的访问权限,并且需要谨慎处理,因为这可能会暴露用户的隐私信息。以下是获取MAC地址的基本步骤: 1. **获取权限**:首先,你需要在`AndroidManifest.xml`文件中添加`ACCESS_WIFI_STATE`和`INTERNET`权限,以及如果需要的话,还可能需要`READ_PHONE_STATE`权限,因为某些情况下会通过IMEI来间接获取MAC。 ```xml <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> ``` 2. **检查权限**:在应用运行时,检查你是否已经获得了所需的权限。 3. **使用Wi-Fi管理API**:你可以尝试使用`WifiManager`类来获取连接的Wi-Fi接口的MAC地址。下面是一个示例代码片段: ```java try { WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); String macAddress = wifiInfo.getMacAddress(); } catch (Exception e) { // 没有Wi-Fi连接或权限问题,可以记录错误日志并提示用户。 } ``` 4. **异常处理**:由于不是所有设备都支持Wi-Fi或者可能存在权限问题,所以获取过程中可能会抛出异常。记得适当地处理这些情况。 需要注意的是,获取MAC地址并不是常规需求,因为它们通常用于标识硬件而不是用户。如果你的应用确实需要这个信息并且符合隐私政策,务必告知用户你将如何使用它,并遵守相关数据保护法规。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值