Q: Android: How to programmatically access the device serial number shown in the AVD manager (API Version 8)
Table of Contents
Up to Android 7.1 (SDK 25) #
Until Android 7.1 you will get it with:
Build.SERIAL
From Android 8 (SDK 26) #
On Android 8 (SDK 26) and above, this field will return UNKNOWN
and must be accessed with:
Build.getSerial()
which requires the dangerous permission android.permission.READ_PHONE_STATE
.
From Android Q (SDK 29) #
Since Android Q using Build.getSerial()
gets a bit more complicated by requiring:
android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE
(which can only be acquired by system apps), or for the calling package to be the device or profile owner and have the READ_PHONE_STATE
permission. This means most apps won’t be able to uses this feature. See the Android Q announcement from Google.
Best Practice for Unique Device Identifier #
If you just require a unique identifier, it’s best to avoid using hardware identifiers as Google continuously tries to make it harder to access them for privacy reasons. You could just generate a UUID.randomUUID().toString();
and save it the first time it needs to be accessed in e.g. shared preferences. Alternatively you could use ANDROID_ID
which is a 8 byte long hex string unique to the device, user and (only Android 8+) app installation. For more info on that topic, see Best practices for unique identifiers.