พอดีมีงานที่ต้องดึง 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 ผิดๆกลับไปใช้งานแทน