Как получить кодовые имена платформы Android, такие как Honeycomb

В моем приложении я хочу показать кодовое имя ОС Android устройства. т.е. я хочу получить кодовые имена Android OS, такие как Honeycomb или же Gingerbread прагматично во время выполнения с устройства.

Есть ли способ получить это кодовое имя? Я хочу показать это имя на одном из экранов моего приложения.

Я могу сравнить, как это и жестко закодировать строку.

 if (Build.VERSION.SDK_INT==Build.VERSION_CODES.GINGERBREAD) {

    CodeName=”GINGERBREAD”

 } else if (Build.VERSION.SDK_INT==Build.VERSION_CODES.HONEYCOMB){

    CodeName=”Honeycom”
 }

Но если завтра выйдет новая версия, то мне придется снова изменить код. Вот почему я ищу некоторые, почему бы получить саму строку кодового имени вместо получения номера версии.

Так может кто-нибудь предложить какой-нибудь способ получить кодовое имя ОС устройства, как мы получаем номер версии ОС?

6 ответов

Решение

В документации Android нет API для возврата строки кодового имени для вас. Вы можете получить только НОМЕР ВЕРСИИ, как 2.3, который вы можете показать пользователям.

Попробуй это.

enum Codenames
{
    BASE, BASE_1,
    CUPCAKE, 
    DONUT, 
    ECLAIR, ECLAIR_MR1, ECLAIR_MR2, 
    FROYO,
    GINGERBREAD, GINGERBREAD_MR1, 
    HONEYCOMB, HONEYCOMB_MR1, HONEYCOMB_MR2,
    ICE_CREAM_SANDWICH, ICE_CREAM_SANDWICH_MR1,
    JELLY_BEAN;

    public static Codenames getCodename()
    {
        int api = Build.VERSION.SDK_INT;

        switch (api) {
        case 1:

            return BASE;
        case 2:

            return BASE_1;
        case 3:

            return CUPCAKE;
        case 4:

            return DONUT;
        case 5:

            return ECLAIR;
        case 6:

            return ECLAIR_MR1;
        case 7:

            return ECLAIR_MR2;
        case 8:

            return FROYO;
        case 9:

            return GINGERBREAD;
        case 10:

            return GINGERBREAD_MR1;
        case 11:

            return HONEYCOMB;
        case 12:

            return HONEYCOMB_MR1;
        case 13:

            return HONEYCOMB_MR2;
        case 14:

            return ICE_CREAM_SANDWICH;
        case 15:

            return ICE_CREAM_SANDWICH_MR1;
        case 16:

            return JELLY_BEAN;
        default:
            return null;
        }
    }

};

а затем сделать

Codenames c = Codenames.getCodename();

import java.lang.reflect.Field;

  Field[] fields = Build.VERSION_CODES.class.getFields();

  String osName = fields[Build.VERSION.SDK_INT + 1].getName();

  Log.d("OsName",""+osName);

Почему бы не использовать отражение?

    String versionCodename = null;
    Field[] fields = Build.VERSION_CODES.class.getFields();
    for (int i = 0; i < fields.length; i++) {
        Field fld = fields[i];
        try {
            int val = fld.getInt(null);
            if (val == Build.VERSION.SDK_INT && fld.getName().length() > 1) {
                String fldName = fld.getName();
                versionCodename = fldName.substring(0, 1).toUpperCase() + fldName.substring(1).toLowerCase();
                break;
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

Таким образом, просто измените .GINGERBREAD на все, что вы хотите, т.е. .HONEYCOMB

if (Build.VERSION.SDK_INT<Build.VERSION_CODES.GINGERBREAD) {
     // do code for device before gingerbread
} 

Также проверьте здесь для получения дополнительной информации - http://developer.android.com/reference/android/os/Build.VERSION.html

Изменить - чтобы получить номер версии как int, вы делаете

int versionNumber = Build.VERSION.SDK_INT;

И тогда вы можете использовать

if (versionNumber == 2.3){
    //do code here
}

Устаревшая строка Build.VERSION.SDK должно сработать

Другие вопросы по тегам