21 July 2017

ว่าด้วยเรื่อง MAC Address บนอุปกรณ์แอนดรอยด์

Updated on

        พอดีมีงานที่ต้องดึง MAC Address ของเครื่องมาใช้งาน ก็เลยขอเขียนบทความทิ้งไว้เตือนความจำซักหน่อย

        เมื่อก่อนนั้นการเขียนโค้ดเพื่อดึง MAC Address บนแอนดรอยด์จะเขียนกันแบบนี้

private String getMacAddress(Context context) {
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    return wifiInfo.getMacAddress();
}

        แล้วก็ต้องประกาศขอ Permission สำหรับเข้าถึงข้อมูลของ WiFi ใน Android Manifest ด้วย

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

        แต่เนื่องจากการมาของ Android 6.0 Marshmallow นั้นได้ปรับเปลี่ยนการทำงานของ MAC Address เพื่อเพิ่มความปลอดภัยให้มากขึ้น Access to Hardware Identifier - Android 6.0 Changes


        จากใจความดังกล่าว นั่นก็หมายความว่าในเวอร์ชันตั้งแต่ Android 6.0 Marshmallow ขึ้นไป เมื่อใช้คำสั่งข้างบนจะได้ MAC Address ออกมาเป็น 02:00:00:00:00:00

        อ้าว แล้วจะทำยังไงล่ะ? ในเมื่อยังมีอีกหลายๆแอปฯที่ต้องใช้ MAC Address ของแต่ละเครื่องอยู่

        ก็เลยต้องใช้วิธีเขียนโค้ดทางอ้อมแบบนี้แทน

public String getMacAddress() {
    try {
        List<NetworkInterface> networkInterfaceList = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface networkInterface : networkInterfaceList) {
            if (!networkInterface.getName().equalsIgnoreCase("wlan0")) {
                continue;
            }

            byte[] macAddress = networkInterface.getHardwareAddress();
            if (macAddress == null) {
                return "";
            }

            StringBuilder result = new StringBuilder();
            for (byte data : macAddress) {
                result.append(Integer.toHexString(data & 0xFF)).append(":");
            }

            if (result.length() > 0) {
                result.deleteCharAt(result.length() - 1);
            }
            return result.toString();
        }
    } catch (Exception ignored) {
    }
    return "02:00:00:00:00:00";
}

        โดยคำสั่งนี้จะต้องประกาศ Permission สำหรับ Internet ไว้ใน Android Manifest ด้วย

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

        ซึ่งคำสั่งนี้ใช้ได้กับแอนดรอยด์ทุกเวอร์ชันไม่ว่าจะต่ำกว่า Android 6.0 Marshmallow หรือสูงกว่าก็ตาม

        ผู้ที่หลงเข้ามาอ่านคนใดที่ใช้คำสั่งแบบเก่าอยู่ก็เปลี่ยนคำสั่งใหม่ได้แล้วนะ ไม่งั้นเดี๋ยวจะได้ MAC Address ผิดๆกลับไปใช้งานแทน