Вопрос по android – Как программно найти название версии Android?

20

Я пишу код для поиска версии Android, как это

<code>String version=Build.VERSION.RELEASE;
</code>

с помощью этого кода я получаю номер версии, но я хочу имя версии. как получить название версии?

Ваш Ответ

10   ответов
0

В этом ответе приведены более полные (более полные) имена для «Зефира», но при этом он также пригоден для использования в будущем, если вы не обновите свое приложение, когда выйдет новая версия (лучшее из обоих миров). Список имен версий поступает изВот.

String versionName =
        Build.VERSION_CODES.class.getFields()[Build.VERSION.SDK_INT + 1].getName();
String[] versionNames = new String[]{
        "ANDROID BASE", "ANDROID BASE 1.1", "CUPCAKE", "DONUT",
        "ECLAIR", "ECLAIR_0_1", "ECLAIR_MR1", "FROYO", "GINGERBREAD",
        "GINGERBREAD_MR1", "HONEYCOMB", "HONEYCOMB_MR1", "HONEYCOMB_MR2",
        "ICE_CREAM_SANDWICH", "ICE_CREAM_SANDWICH_MR1",
        "JELLY_BEAN", "JELLY_BEAN_MR1", "JELLY_BEAN_MR2", "KITKAT", "KITKAT_WATCH",
        "LOLLIPOP", "LOLLIPOP_MR1", "MARSHMALLOW", "NOUGAT", "OREO", "OREO_MR1"
};
int nameIndex = Build.VERSION.SDK_INT - 1;
if (nameIndex < versionNames.length) {
    versionName = versionNames[nameIndex];
}

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

1

Как описано в документации по Android, уровень SDK (целое число), на котором работает телефон, доступен в:

android.os.Build.VERSION.SDK_INT;

Перечисление, соответствующее этому int, находится в классе android.os.Build.VERSION_CODES.

Пример кода:

int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.FROYO){
    // Do something for froyo and above versions
} else{
    // do something for phones running an SDK before froyo
}

Изменить: Этот SDK_INT доступен с Donut (android 1.6 / API4), поэтому убедитесь, что ваше приложение не является ретро-совместимым с Cupcake (android 1.5 / API3), когда вы его используете, иначе ваше приложение вылетит (спасибо программисту Брюсу за точность) ,

3

Проверь это:

// Names taken from android.os.build.VERSION_CODES
String[] mapper = new String[] {
    "ANDROID BASE", "ANDROID BASE 1.1", "CUPCAKE", "DONUT",
    "ECLAIR", "ECLAIR_0_1", "ECLAIR_MR1", "FROYO", "GINGERBREAD",
    "GINGERBREAD_MR1", "HONEYCOMB", "HONEYCOMB_MR1", "HONEYCOMB_MR2",
    "ICE_CREAM_SANDWICH", ",;ICE_CREAM_SANDWICH_MR1", "JELLY_BEAN"
};
int index = Build.VERSION.SDK_INT - 1;
String versionName = index < mapper.length? mapper[index] : "UNKNOWN_VERSION"; // > JELLY_BEAN)

Имейте в виду, что это решение будет работать только до тех пор, пока коды версий увеличиваются на единицу, и вам придется обновлять список с каждой новой версией Android (если важна точность).

Так что, каждой новой версии Android вам придется обновлять этот массив, слабо.
5

http://developer.android.com/reference/android/os/Build.VERSION_CODES.html содержит поля с именем, которое вы ищете. Таким образом, вы можете использовать рефлексию, чтобы найти, какое поле соответствует & quot; версии & quot; значение.

Почему вы хотите имя?

Я только что дал вам один и другой ответ: используйте android.os.Build.VERSION.SDK_INT, чтобы получить число, а затем найдите, какое поле в android.os.Build.VERSION_CODES имеет это значение с помощью рефлексии. Название поля - это то, что вы ищете
ТАК нет прямого способа получить название версии ???? Venkat
Требование клиента - получить номер версии и название версии своего мобильного телефона. Venkat
Тогда лучше всего, вероятно, отправить Build.VERSION.SDK_INT на ваш сервер, а затем сопоставить этот int с именами, которые вы хотите дать своим клиентам.
50

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

import java.lang.reflect.Field;
...

StringBuilder builder = new StringBuilder();
builder.append("android : ").append(Build.VERSION.RELEASE);

Field[] fields = Build.VERSION_CODES.class.getFields();
for (Field field : fields) {
    String fieldName = field.getName();
    int fieldValue = -1;

    try {
        fieldValue = field.getInt(new Object());
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }

    if (fieldValue == Build.VERSION.SDK_INT) {
        builder.append(" : ").append(fieldName).append(" : ");
        builder.append("sdk=").append(fieldValue);
    }
}

Log.d(LOG_TAG, "OS: " + builder.toString());

На моем эмуляторе 4.1 я получаю такой вывод:

D/MainActivity( 1551): OS: android : 4.1.1 : JELLY_BEAN : sdk=16

Наслаждайтесь!

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

Оптимизированный код, это будет работать:

import java.lang.reflect.Field;

Field[] fields = Build.VERSION_CODES.class.getFields();
String osName = fields[Build.VERSION.SDK_INT + 1].getName();
Log.d("Android OsName:",osName);
Да, Android возвращает имя в зависимости от определенных переменныхdeveloper.android.com/reference/android/os/…
Просто к сведению: для Android 8.1 это дает: O_MR1
0

Отражение не работает, когда я пробовал в эмуляторе, работающем на API 19.

Поэтому я придумаю гибридный ответ «Nacho Coloma». и «Кевин Грант»;

String osName="";
Field[] fields = Build.VERSION_CODES.class.getFields();
for (Field field : fields) {
    String fieldName = field.getName();
    int fieldValue = -1;

    try {
        fieldValue = field.getInt(new Object());
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }

    if (fieldValue == Build.VERSION.SDK_INT) {
        osName=fieldName; break;
    }
}
if(osName.isEmpty()) {
    String[] mapper = new String[]{
            "ANDROID BASE", "ANDROID BASE 1.1", "CUPCAKE", "DONUT",
            "ECLAIR", "ECLAIR_0_1", "ECLAIR_MR1", "FROYO",
            "GINGERBREAD", "GINGERBREAD_MR1", "HONEYCOMB", "HONEYCOMB_MR1",
            "HONEYCOMB_MR2", "ICE_CREAM_SANDWICH", "ICE_CREAM_SANDWICH_MR1", "JELLY_BEAN",
            "JELLY_BEAN", "JELLY_BEAN", "KITKAT", "KITKAT",
            "LOLLIPOOP", "LOLLIPOOP_MR1", "MARSHMALLOW", "NOUGAT",
            "NOUGAT", "OREO", "OREO", "ANDROID P"};
    int index = Build.VERSION.SDK_INT - 1;
    osName = index < mapper.length ? mapper[index] : "UNKNOWN_VERSION";
}
-2

Вы можете попробовать следующую функцию.

 public String AndroidOSName() {
    String os = Build.VERSION.SDK;
    System.out.println("here is my os" + " " + os);
    if (os.equals("23")) {
        return "Marshmallow";
    } else if (os.equals("21")) {
        return "Lollipop";
    } else if (os.equals("22")) {
        return "LOLLIPOP_MR1";
    } else if (os.equals("20")) {
        return "KitKat";
    } else if (os.equals("19")) {
        return "KitKat";
    } else if (os.equals("18")) {
        return "Jelly Bean";
    } else if (os.equals("17")) {

        return "Jelly Bean";
    } else if (os.equals("16")) {
        return "Jelly Bean";
    } else if (os.equals("15")) {
        return "Ice Cream Sandwich";
    } else if (os.equals("14")) {
        return "Ice Cream Sandwich";
    } else if (os.equals("13")) {
        return "Honeycomb";
    } else if (os.equals("12")) {
        return "Honeycomb";
    } else if (os.equals("11")) {
        return "Honeycomb";
    } else if (os.equals("10")) {
        return "Gingerbread";
    } else if (os.equals("9")) {
        return "Froyo";
    } else if (os.equals("8")) {
        return "Froyo";
    } else {
        return "Not Found";
    }

}
Обратите внимание, если вы хотите продвигать свой собственный сайт или блог,you must disclose your affiliation in the answer, В противном случае ваш ответ может быть помечен как спам. Пожалуйста, прочитайтеHow to not be a spammer.
3

Вы получите информацию от этих

android.os.Build.VERSION_CODES 

android.os.Build.VERSION.SDK_INT

Больше информации можно получить по этой ссылке:

Получение версии Android API программно

Надеюсь, что это поможет вам.

0

Я применил решение, описанное выше, но не совсем доволен "O". и "N"; как имена версий, поэтому я внес некоторые изменения. Надеюсь, это будет полезно и для других

    /**
 * Gets the version name from version code. Note! Needs to be updated
 * when new versions arrive, or will return a single letter. Like Android 8.0 - Oreo
 * yields "O" as a version name.
 * @return version name of device's OS
 */
private static String getOsVersionName() {
    Field[] fields = Build.VERSION_CODES.class.getFields();
    String name =  fields[Build.VERSION.SDK_INT + 1].getName();

    if(name.equals("O")) name = "Oreo";
    if(name.equals("N")) name = "Nougat";
    if(name.equals("M")) name = "Marshmallow";

    if(name.startsWith("O_")) name = "Oreo++";
    if(name.startsWith("N_")) name = "Nougat++";

    return name;
}

Похожие вопросы