Android: как программно получить доступ к серийному номеру устройства, показанному в диспетчере AVD (API версии 8)

Как мне программно получить доступ к значению, показанному на рисунке ниже?

enter image description here

 George Stocker♦14 июн. 2012 г., 13:32
возможный дубликатHow to find serial number of Android device?

Ответы на вопрос(3)

Решение Вопроса

Android 8 and later (>= SDK 26) use android.os.Build.getSerial() which requires the dangerous permission READ_PHONE_STATE. Using android.os.Build.SERIAL returns android.os.Build.UNKNOWN.

Android 7.1 and earlier (<= SDK 25) and earlier android.os.Build.SERIAL does return a valid serial.

Это уникально для любого устройства. Если вы ищете возможности получить / использовать уникальный идентификатор устройства, вы должны прочитатьВот.

Для решения с отражением без разрешения см.этот ответ.

 11 июл. 2012 г., 11:22
Том ты прав! Я перепутал ANDROID_ID и SERIAL. Я отредактировал свой ответ.
 25 апр. 2014 г., 06:52
Это как-то изменится в будущем?
 28 янв. 2019 г., 14:44
этот ответ должен быть отредактирован как с Android 8 (API26) и выше Build.SERIAL не будет работать. Единственный способ получить серийный номер - вызвать метод Build.getSerial (), для которого требуются разрешения READ_PHONE_STATE.
 24 апр. 2014 г., 15:37
Обычно это тот же серийный номер, который производитель физически печатает на самом устройстве, или серийный номер только для программного обеспечения?
 10 июл. 2012 г., 18:50
Почему вы говорите, что он меняется на заводские настройки? Я знаю, что это верно для Settings.Secure.ANDROID_ID, но я не слышал об этом для Build.Serial.

Build.SERIAL может быть пустым или иногда возвращать другое значение (доказательство 1, доказательство 2), чем вы можете видеть в настройках вашего устройства.

Если вам нужно более полное и надежное решение, я собрал каждое возможное решение в одномсуть, Вот его упрощенная версия:

public static String getSerialNumber() {
    String serialNumber;

    try {
        Class<?> c = Class.forName("android.os.SystemProperties");
        Method get = c.getMethod("get", String.class);

        serialNumber = (String) get.invoke(c, "gsm.sn1");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "ril.serialnumber");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "ro.serialno");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "sys.serialnumber");
        if (serialNumber.equals(""))
            serialNumber = Build.SERIAL;

        // If none of the methods above worked
        if (serialNumber.equals(""))
            serialNumber = null;
    } catch (Exception e) {
        e.printStackTrace();
        serialNumber = null;
    }

    return serialNumber;
}

Я стараюсь регулярно обновлять суть всякий раз, когда я могу проверить на новом устройстве или версии Android. Вклад также приветствуется.

 30 янв. 2019 г., 09:15
Это должен быть принятый ответ. Полный и точный!
Up to Android 7.1 (SDK 25)

До Android 7.1 вы получите его с:

Build.SERIAL
From Android 8 (SDK 26)

В Android 8 (SDK 26) и выше это поле будет возвращеноUNKNOWN и должны быть доступны с:

Build.getSerial()

который требуетопасное разрешение android.permission.READ_PHONE_STATE.

From Android Q (SDK 29)

Поскольку Android Q используетBuild.getSerial() становится немного сложнее, требуя:

android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE (которые могут быть получены только системными приложениями),or для вызывающего пакета, чтобы бытьdevice or profile owner и иметьREAD_PHONE_STATE разрешение. Это означает, что большинство приложений не смогут использовать эту функцию.

УвидетьAndroid Q анонс от гугла.

УвидетьСсылка на Android SDK

 30 нояб. 2017 г., 14:39
@peceps отредактировано :)
 01 авг. 2018 г., 00:39
На данный момент это правильный ответ.
 30 нояб. 2017 г., 12:37
Я проголосовал, вероятно, по ошибке, теперь это правильный ответ. Я не могу удалить свое пониженное голосование, потому что оно заблокировано, пока ответ не отредактирован.
 01 дек. 2017 г., 16:01
круто, я преобразовал голосование против.
 21 нояб. 2017 г., 18:02
Может ли downvoter объяснить, почему он / она считает, что это неправильно?

Ваш ответ на вопрос