您的位置:首页 > 移动开发 > Android开发

Android 6.0获取MAC地址

2016-12-16 11:23 218 查看
众所周知,Android 6.0系统,做出许多重大的变化,例如获取获取蓝牙MAC地址,如果使用‘BluetoothAdapter.getAddress()’将返回的是02:00:00:00:00:00
常量,不是真实的蓝牙MAC地址。

     看看官方是怎么描述的。为了给用户更多的数据保护,从这个版本开始, Android 移除了通过 WiFi 和蓝牙 API 来在应用程序中可编程的访问本地硬件标示符。现在 WifiInfo.getMacAddress() 和 BluetoothAdapter.getAddress() 方法都将返回 02:00:00:00:00:00 。

注意:在一个运行 Android 6.0 (API 级别 23) 的设备初始化后台的 WiFi 或蓝牙扫描时,操作对于外部设备是可见的,且被赋予一个随机的 MAC 地址。

     但是,我们在实际开发中,依旧需要使用 MAC地址,那没有一种‘万能’方法,不管是在6.0,还是在低版本都可以获取到 MAC地址呢?答案是有的!下面就介绍一种解决方法。这种方法获取的WLAN MAC地址。

具体代码如下:

[java] view
plain copy

 





/** 

 * 获取Mac地址 

 */  

public class MacUtils {  

      

      

    /** 

     * 获取手机的MAC地址 

     *  

     * @return 

     */  

    public static String getMac() {  

        String str = "";  

        String macSerial = "";  

        try {  

            Process pp = Runtime.getRuntime().exec(  

                    "cat /sys/class/net/wlan0/address ");  

            InputStreamReader ir = new InputStreamReader(pp.getInputStream());  

            LineNumberReader input = new LineNumberReader(ir);  

  

            for (; null != str;) {  

                str = input.readLine();  

                if (str != null) {  

                    macSerial = str.trim();// 去空格  

                    break;  

                }  

            }  

        } catch (Exception ex) {  

            ex.printStackTrace();  

        }  

        if (macSerial == null || "".equals(macSerial)) {  

            try {  

                return loadFileAsString("/sys/class/net/eth0/address")  

                        .toUpperCase().substring(0, 17);  

            } catch (Exception e) {  

                e.printStackTrace();  

  

            }  

  

        }  

        return macSerial;  

    }  

      

    public static String loadFileAsString(String fileName) throws Exception {  

        FileReader reader = new FileReader(fileName);  

        String text = loadReaderAsString(reader);  

        reader.close();  

        return text;  

    }  

  

    public static String loadReaderAsString(Reader reader) throws Exception {  

        StringBuilder builder = new StringBuilder();  

        char[] buffer = new char[4096];  

        int readLength = reader.read(buffer);  

        while (readLength >= 0) {  

            builder.append(buffer, 0, readLength);  

            readLength = reader.read(buffer);  

        }  

        return builder.toString();  

    }     

  

}  

经测试,该代码在6.0和4.x版本上都可以获取到真实的MAC地址。

PS:在6.0上需要AndroidManifest.xml在加入以下2个权限,

[java] view
plain copy

 





<!--android6.0权限模型-->  

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

  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android mac