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


581

Есть ли способ получить версию API, которая работает на телефоне в данный момент?


62
@SteveHaley Мы обычно считаем, что то, что приходит первым, не является дубликатом того, что появляется позже.
— Rds

5
Возможный дубликат Как получить версию Android SDK?
— Таокп

Ответы:


1068

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

android.os.Build.VERSION.SDK_INT

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

Пример кода:

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

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

Соответствующая документация для Android здесь и здесь


18
Если код работает на 1.5, то ссылка на SDK_INT вызовет исключение, так как он был введен с API 4. (Да, вы можете запустить APK, скомпилированный с кодом API 4 на 1.5. И да, когда этот код API 4 достигнут Это исключение.)
— Программист Брюс,

@ProgrammerBruce, как предотвратить сбой? Или как не быть ретро-совместимым?
— Cœur

1
@ Cœur Я думаю, что создание приложения, ретро совместимого с Android 1.5, в настоящее время не очень полезно. Просто установите свой проект minSdkVersionна 4(Android 1.6) и идти дальше.
— ol_v_er

Почему бы вместо этого не использовать String android.os.Build.VERSION.SDK ? Он работает для всех версий Android
— Pyk

@PYK Этот атрибут android.os.Build.VERSION.SDK устарел, поэтому его не следует использовать. developer.android.com/reference/android/os/...
— ol_v_er

146

Очень просто:

   String manufacturer = Build.MANUFACTURER;
   String model = Build.MODEL;
   int version = Build.VERSION.SDK_INT;
   String versionRelease = Build.VERSION.RELEASE;

Log.e("MyActivity", "manufacturer " + manufacturer
            + " \n model " + model
            + " \n version " + version
            + " \n versionRelease " + versionRelease
    );

Вывод:

E/MyActivity:   manufacturer ManufacturerX
                model SM-T310 
                version 19 
                versionRelease 4.4.2

2
Build.VERSION.RELEASE это то, что я искал. Спасибо @CommonSenseCode
— axierjhtjz

81
Build.VERSION.RELEASE;

Это даст вам фактические номера вашей версии; ака 2.3.3 или 2.2. Проблема с использованием Build.VERSION.SDK_INT заключается в том, что если у вас есть рутированный телефон или пользовательский rom, у вас может быть нестандартная ОС (она же на моем Android работает под управлением 2.3.5), которая при использовании Build.VERSION.SDK_INT возвращает ноль. поэтому Build.VERSION.RELEASE будет работать независимо от того, используется ли стандартная версия Android или нет!

Чтобы использовать это, вы можете просто сделать это;

String androidOS = Build.VERSION.RELEASE;

9
Согласно документации int android.os.Build.VERSION.SDK_INTи public static final int SDK_INTи Added in API level 4как бы Int (не Integer) возвращение NULL? NULLявляется состоянием для объекта, поэтому его Build или VERSION могут быть nullтеоретически, но в этом случае не только, SDK_INTно RELEASEтакже и приведет к NPE. SDK_INT может вызвать «Нет такого исключения метода» или что-то в этом роде, но не NULL или NPE. Если только пользовательское ПЗУ ломает документы и метод, объявленный как public static final Integer SDK_INT. Я просто пытаюсь определить характер проблемы, чтобы обойти ее.
— Стэн

3
Кто-нибудь может проверить, так ли это на самом деле? Комментарий Стэна ясно показывает, что ноль невозможен. И пользовательские Android ROM / OS, безусловно, должны происходить из какой-то сборки версии? Так что, конечно, Build.VERSION.SDK_INT должен это отражать?
— BT

3
Я отклонил это, так как претензия не подтверждена, и предупреждение о nullней не имеет смысла.
— Сэм

Укорененный телефон или пользовательские ромы никогда не должны касаться этого номера. Хотя обычно они меняют Build.VERSION.RELEASE.
— Фуах Йи Кит

Существует много известных проблем, когда речь заходит о пользовательских ОС / Roms. Версия, которая была у меня на моем старом Android в то время (я хочу сказать, GS3), имела эту проблему. Было много проблем с жестко закодированными значениями или значениями, которые были не просто правильными. Жесткий пример, адреса Mac Wi-Fi жестко закодированы.
— Falcon165o

31

Принимая во внимание все сказанное, вот код, который я использую для обнаружения, если устройство имеет Froyo или более новую ОС Android (2.2+):

public static boolean froyoOrNewer() {
    // SDK_INT is introduced in 1.6 (API Level 4) so code referencing that would fail
    // Also we can't use SDK_INT since some modified ROMs play around with this value, RELEASE is most versatile variable
    if (android.os.Build.VERSION.RELEASE.startsWith("1.") ||
        android.os.Build.VERSION.RELEASE.startsWith("2.0") ||
        android.os.Build.VERSION.RELEASE.startsWith("2.1"))
        return false;

    return true;
}

Очевидно, что вы можете изменить это, если условие учитывает версии Android 1.0 и 1.5, если вам нужен универсальный контролер. Вы, вероятно, в конечном итоге что-то вроде этого:

// returns true if current Android OS on device is >= verCode 
public static boolean androidMinimum(int verCode) {
    if (android.os.Build.VERSION.RELEASE.startsWith("1.0"))
        return verCode == 1;
    else if (android.os.Build.VERSION.RELEASE.startsWith("1.1")) {
        return verCode <= 2;
    } else if (android.os.Build.VERSION.RELEASE.startsWith("1.5")) {
        return verCode <= 3;
    } else {
        return android.os.Build.VERSION.SDK_INT >= verCode;
    }
}

Дайте мне знать, если код не работает для вас.


29

попробуй это:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only for gingerbread and newer versions
 }

9

android.os.Build.VERSION.SDK должен дать вам значение уровня API. Вы можете легко найти отображение уровня API в версию для Android в документации по Android. Я считаю, что 8 для 2.2, 7 для 2.1 и так далее.


Этот метод устарел.
— Ади

4

Понял. Это с использованием getApplicationInfo()метода Contextкласса.


1
Это даст вам minSdkVersion и targetSdkVersion APK, который описывает, какие версии API поддерживает приложение. Это не версия API телефона, на котором сейчас работает приложение.
— OldSchool4664

2

SDK.INT поддерживается для Android 1.6 и выше

SDK поддерживается для всех версий

Итак, я делаю:

String sdk_version_number = android.os.Build.VERSION.SDK;

Кредиты для: CommonsWare за этот ответ


SDK устарел в Java.
— Лимоник

0

Я предпочитаю, чтобы номер версии был обработан более легко, чем я написал это:

  public static float getAPIVerison() {

    Float f = null;
    try {
        StringBuilder strBuild = new StringBuilder();
        strBuild.append(android.os.Build.VERSION.RELEASE.substring(0, 2));
        f = new Float(strBuild.toString());
    } catch (NumberFormatException e) {
        Log.e("", "error retriving api version" + e.getMessage());
    }

    return f.floatValue();
}

0

Работает счастливое кодирование

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

Примечание. Пожалуйста, убедитесь, что ваш пакет импорта правильный (импортируйте имя пакета вашего приложения, иначе оно не будет работать должным образом)


-2

Я улучшил код, который использовал

public static float getAPIVerison() {

    float f=1f;
    try {
        StringBuilder strBuild = new StringBuilder();
        strBuild.append(android.os.Build.VERSION.RELEASE.substring(0, 2));
        f= Float.valueOf(strBuild.toString());
    } catch (NumberFormatException e) {
        Log.e("myApp", "error retriving api version" + e.getMessage());
    }

    return f;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.