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

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

private fun getMacAddress(context: Context): String? {
        val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
        val wifiInfo = wifiManager.connectionInfo
        return wifiInfo.macAddress
    }

แล้วก็ต้องประกาศขอ 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 ของแต่ละเครื่องอยู่

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

private fun getMacAddress(): String? {
        try {
            val networkInterfaceList: List<NetworkInterface> =
                Collections.list(NetworkInterface.getNetworkInterfaces())
            for (networkInterface in networkInterfaceList) {
                if (networkInterface.name != "wlan0") {
                    continue
                }
                val macAddress: ByteArray = networkInterface.hardwareAddress ?: return ""
                val result = StringBuilder()
                for (data in macAddress) {
                    result.append(Integer.toHexString(data.toInt() and 0xFF)).append(":")
                }
                if (result.isNotEmpty()) {
                    result.deleteCharAt(result.length - 1)
                }
                return result.toString()
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return "02:00:00:00:00:00"
    }

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

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

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

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