Table of Contents
Up to Android 7.1 (SDK 25) #
Until Android 7.1 you will get it with:
From Android 8 (SDK 26) #
On Android 8 (SDK 26) and above, this field will return
UNKNOWN and must be accessed with:
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.