Уникальный серийный номер Android

Я разрабатываю приложение для Android, которое предназначено для Android 4.0 (API 14) и выше.

Я ищу серийный номер, который уникален для каждого устройства и который сохраняется навсегда (умирает с устройством, не изменяется после заводских настроек).

Я нашел много результатов в Интернете относительно уникальных идентификаторов для устройств Android, но очень мало на номере android.os.Build.SERIAL .

До сих пор я исключил использование ANDROID_ID, потому что он может измениться после сброса настроек . Я также исключил использование IMEI, потому что устройство Android может быть не телефоном. Я не могу использовать MAC ADDRESS Wi-Fi или Bluetooth, потому что у устройства может не быть такого оборудования и / или такие макинтош-адреса могут быть недоступны для чтения, если оборудование не включено (в зависимости от того, что я нашел в Интернете).

Я считаю, что могу пойти на серийный номер устройства Android.

Он легко доступен с помощью android.os.Build.SERIAL (поскольку он добавлен в уровень API 9 и не нуждается в дополнительном разрешении).

Мои вопросы:

  • Принимая во внимание, что мое приложение предназначено для Android 4.0 (API 14) и выше, это номер android.os.Build.SERIAL для устройств Android, уникальных для каждого устройства?

  • В настоящее время документация android.os.Build.SERIAL указывает: серийный номер оборудования, если он доступен. Буквенно-цифровой, без учета регистра. Означает ли это, что серийный номер может быть недоступен?

  • Что может быть другой альтернативой, отвечающей указанным выше условиям?

Solutions Collecting From Web of "Уникальный серийный номер Android"

Принимая во внимание, что мое приложение предназначено для Android 4.0 (API 14) и выше, это номер android.os.Build.SERIAL для устройств Android, уникальных для каждого устройства?

Согласно этой полезной статье в блоге Android Developers, android.os.Build.SERIAL должен быть уникальным, если он доступен. Из статьи:

Устройства без телефонии должны сообщать об уникальном идентификаторе устройства здесь; Некоторые телефоны тоже могут это сделать.

Означает ли это, что серийный номер может быть недоступен?

Правильно, он может быть недоступен. Обратите внимание, что они говорят: «Устройства без телефонии необходимы …» , поэтому для доставки номера SERIAL требуется только устройства без «телефонии» (например, только для Wi-Fi), хотя некоторые телефоны все еще работают (например, Nexus 4).

Документации, безусловно, не хватает на эту тему, но из формулировки вполне возможно, что только «устройства без телефонии» должны предоставить уникальный идентификатор, а телефоны, которые его подают, могут быть не уникальными.

Что может быть другой альтернативой, отвечающей указанным выше условиям?

Для вашей ситуации я считаю, что лучше всего сначала проверить на deviceId (IMEI, а что нет), и если deviceId не существует, вы откажитесь от использования android.os.Build.SERIAL (так как это, вероятно, планшет), как так:

 public static String getDeviceId(Context context) { final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); if (deviceId != null) { return deviceId; } else { return android.os.Build.SERIAL; } } 

Имейте в виду использовать deviceId вам нужно разрешение android.permission.READ_PHONE_STATE .

Так как minSDK вашего приложения – 14, вы можете безопасно использовать поле android.os.Build.SERIAL . И если мы предположим, что устройства без телефонии действительно всегда предоставляют уникальные идентификаторы в SERIAL тогда я думаю, что это будет безопасная ставка на всегда получение уникального идентификатора устройства (конечно, барин ошибок).

Я лично использую AndroidID и Build.SERIAL для идентификации телефона.

 androidId = Settings.Secure.getString(this.getContentResolver(),Settings .Secure.ANDROID_ID) + Build.SERIAL; 

У них может быть тот же AndroidID, у них может не быть Serial. Но шанс иметь их обоих невысок.

Вы, похоже, очень хорошо описали ситуацию.

Серийный номер должен быть уникальным для каждого устройства, но (это Android) есть, конечно, ошибки, которые создают исключения, например https://code.google.com/p/android/issues/detail?id=35193

Как вы отметили, документы предлагают, чтобы это было серийным номером оборудования, но способ, которым он сформулирован, предполагает, что вы не должны рассчитывать на это. И не ошибайтесь, что для фактического серийного номера устройства, то есть серийного номера, напечатанного на обратной стороне или на коробке. Кроме того, я считаю, что он гораздо менее широко используется, чем android_id, поэтому могут возникнуть проблемы, о которых не сообщается.

Я видел, как широко сообщается о том, что android_id основан на серийном номере, но я считаю, что это неверно. Недавно я заметил, что на планшете с новой многопользовательской способностью каждая учетная запись пользователя получает свой собственный android_id, но Серийный номер для обоих.

AFAIK «другая альтернатива» не существует: ваш список завершен. Серийный номер является самым близким к тому, что вы ожидаете, если только вы не готовы зависеть от разрешений wifi или bluetooth.

Обычно я получаю уникальный идентификатор, выполняя хэш SHA1 некоторой уникальной строки (обычно название компании) + imei (если нет imei, mac address [wifi, bluetooth и т. Д.]). Это дает мне уникальные идентификаторы, которые выглядят одинаково, как правило, уникальны для каждого устройства (не идеально, если MAC изменен / фальсифицирован, хотя).