Уникальный серийный номер Android
Я разрабатываю приложение для Android, которое предназначено для Android 4.0 (API 14) и выше.
Я ищу серийный номер, уникальный для каждого устройства и который сохраняется навсегда (умирает с устройством, не изменяется после сброса factory).
Я нашел много результатов в Интернете относительно уникальных идентификаторов для устройств Android, но очень мало на номере android.os.Build.SERIAL.
До сих пор я исключил использование ANDROID_ID, потому что он может измениться после сброса factory. Я также исключил использование IMEI, потому что устройство Android может быть не телефоном. Я не могу использовать wifi или bluetooth MAC ADDRESS, потому что у устройства может не быть такого оборудования и/или такие макинтош-адреса могут быть недоступны для чтения, если оборудование не включено (на основе того, что я нашел в Интернете).
Я считаю, что могу пойти на серийный номер устройства Android.
Он легко доступен с помощью android.os.Build.SERIAL (поскольку он добавлен в уровень API 9 и не нуждается в дополнительном разрешении).
Мои вопросы:
-
Принимая во внимание, что мое приложение предназначено для Android 4.0 (API 14) и выше, это номер android.os.Build.SERIAL для уникальных устройств Android для каждого устройства?
-
В настоящее время документация android.os.Build.SERIAL указывает: Серийный номер оборудования, если он доступен. Буквенно-цифровой, без учета регистра.
Означает ли это, что серийный номер может быть недоступен?
-
Что может быть другой альтернативой, отвечающей указанным выше условиям?
Ответы
Ответ 1
Принимая во внимание, что мое приложение предназначено для Android 4.0 (API 14) и выше, это номер android.os.Build.SERIAL для устройств Android, уникальных для каждого устройства?
В соответствии с этой полезной статьей в блоге разработчиков Android, 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
, тогда я думаю, что это будет безопасная ставка на всегда получение уникального идентификатора устройства (например, любые ошибки).
Ответ 2
Я лично использую Secure.ANDROID_ID
и Build.SERIAL
для идентификации телефона:
androidId = Settings.Secure.getString(this.getContentResolver(),
Settings.Secure.ANDROID_ID) + Build.SERIAL;
Они могут иметь одинаковые ANDROID_ID
, они могут не иметь SERIAL
. Но вероятность того, что у обоих будет низкая.
Ответ 3
Вы, похоже, очень хорошо описали ситуацию.
Серийный номер должен быть уникальным для каждого устройства, но (это Android) есть, конечно, ошибки, которые создают исключения, например.
https://code.google.com/p/android/issues/detail?id=35193
Как вы указали, документы предлагают, чтобы это было серийным номером оборудования, но способ, которым он сформулирован, предполагает, что вы не должны рассчитывать на это. И не ошибайтесь, что для фактического серийного номера устройства, то есть серийный номер, напечатанный на обратной стороне или на коробке. Кроме того, я считаю, что он гораздо менее широко используется, чем android_id, поэтому могут быть проблемы, о которых не сообщается.
Я видел, как широко сообщалось, что android_id основан на серийном номере, но я считаю, что это неверно. Недавно я заметил, что на планшете с новой многопользовательской возможностью каждая учетная запись пользователя получает свои собственные android_id, но серийный номер одинаковый для обоих.
AFAIK "другая альтернатива" не существует: ваш список завершен. Серийный номер является самым близким к тому, что вам нужно, если вы не готовы зависеть от разрешений wifi или bluetooth.
Ответ 4
Я обычно получаю уникальный идентификатор, выполняя хэш SHA1 некоторой уникальной строки (обычно название компании) + imei (если нет imei, mac address [wifi, bluetooth и т.д.]). Это дает мне уникальный идентификатор, который выглядит одинаково, как правило, уникален для каждого устройства (не идеально, если MAC изменен/фальшив, хотя).