ภาพรวม
บทความนี้แนะนำการดึง Serial Number ของอุปกรณ์ผ่าน Build.getSerial() (API 26+) แทน Build.SERIAL ที่ Deprecated แล้ว ต้องขออนุญาต READ_PHONE_STATE
โค้ดหลัก
// API 26+ (Android 8.0 Oreo) textView.setText(Build.getSerial()); // API เก่า (Deprecated) textView.setText(Build.SERIAL);
การเปลี่ยนแปลงตามเวอร์ชัน Android
| Android Version | API | วิธีเข้าถึง Serial | Permission |
|---|---|---|---|
| Android 7.1 และก่อน | < 26 | Build.SERIAL (public field) | ไม่ต้องการ |
| Android 8.0 - 9.0 | 26-28 | Build.getSerial() | READ_PHONE_STATE |
| Android 10 (Q) | 29 | Build.getSerial() | READ_PRIVILEGED_PHONE_STATE* |
| Android 11+ | 30+ | Build.getSerial() | READ_PRIVILEGED_PHONE_STATE* (System apps เท่านั้น) |
* READ_PRIVILEGED_PHONE_STATE ให้เฉพาะ System/Privileged apps แอปทั่วไปจะได้ค่า "unknown" หรือโยน SecurityException
โค้ดที่รองรับหลายเวอร์ชัน
public static String getDeviceSerial(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Android 8.0+
if (context.checkSelfPermission(Manifest.permission.READ_PHONE_STATE)
== PackageManager.PERMISSION_GRANTED) {
return Build.getSerial();
}
} else {
// Android 7.1 และก่อน
return Build.SERIAL;
}
return "unknown";
}
ทางเลือกแทน Serial Number (สำหรับ Android 10+)
- Settings.Secure.ANDROID_ID: Unique per app-signing-key + user + device (Reset เมื่อ Factory Reset)
- Advertising ID: สำหรับโฆษณา ผู้ใช้รีเซ็ตได้
- Instance ID / Firebase Installation ID: ต่อแอปต่ออินสแตนซ์
- Attestation Key: Hardware-backed key สำหรับ Device Integrity
ข้อควรระวัง
- Serial Number ถือเป็น PII (Personally Identifiable Information)
- Google Play Policy จำกัดการเก็บรวบรวม Hardware IDs
- ควรใช้ Android ID หรือ Advertising ID แทนสำหรับกรณีส่วนใหญ่
Manifest
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>