Уникальный серийный номер 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 изменен/фальшив, хотя).