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

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


person Parth Mehta    schedule 06.08.2010    source источник


Ответы (12)


Как описано в документации 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 находится здесь и здесь

person ol_v_er    schedule 15.10.2010
comment
Если код работает на 1.5, то ссылка на SDK_INT вызовет исключение, так как он был введен с API 4. (Да, вы можете запустить APK, скомпилированный с кодом API 4 на 1.5. И да, когда этот код API 4 будет достигнут , это вызывает исключение.) - person Programmer Bruce; 14.05.2011
comment
@ProgrammerBruce как предотвратить вылет? Или как не быть ретро-совместимым? - person Cœur; 28.12.2018
comment
@ Cœur Я думаю, что создание ретро-приложения, совместимого с Android 1.5, в настоящее время не очень полезно. Просто установите для вашего проекта minSdkVersion значение 4 (Android 1.6) и продолжайте. - person ol_v_er; 08.01.2019
comment
Почему бы вместо этого не использовать String android.os.Build.VERSION.SDK? Работает для всех версий Android. - person PYK; 30.10.2019
comment
@PYK Этот атрибут android.os.Build.VERSION.SDK устарел, поэтому его не следует использовать. developer.android.com/reference/android/os/ - person ol_v_er; 12.11.2019

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

   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
person CommonSenseCode    schedule 28.01.2016
comment
Build.VERSION.RELEASE - это то, что я искал. Спасибо @CommonSenseCode - person axierjhtjz; 20.03.2019
comment
Просто помню, что SDK_INT был добавлен в API уровня 4 - person PYK; 06.10.2020

Build.VERSION.RELEASE;

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

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

String androidOS = Build.VERSION.RELEASE;
person Falcon165o    schedule 07.03.2012
comment
Согласно документам int android.os.Build.VERSION.SDK_INT, public static final int SDK_INT и Added in API level 4, как int (не Integer) может возвращать NULL? NULL - это состояние объекта, поэтому его Сборка или ВЕРСИЯ может быть null теоретически, но в таком случае не только SDK_INT, но и RELEASE вызовут NPE. SDK_INT, вероятно, может вызвать исключение такого метода или что-то в этом роде, но не null или NPE. Если только пользовательское ПЗУ нарушает документацию и метод, объявленный как public static final Integer SDK_INT. Я просто пытаюсь определить характер проблемы, чтобы найти обходной путь. - person Stan; 05.09.2013
comment
Кто-нибудь может проверить, так ли это на самом деле? Комментарий Стэна довольно ясно показывает, что null невозможен. И пользовательские ПЗУ / ОС Android обязательно должны происходить из какой-то сборки версии? Так что, конечно же, Build.VERSION.SDK_INT должен это отражать? - person btalb; 15.10.2014
comment
Я отклонил это предложение, поскольку на самом деле это не подтверждено, а предупреждение о null не имеет смысла. - person Sam; 26.12.2014
comment
Телефон с рутированным доступом или пользовательские ромы никогда не должны касаться этого номера. Однако они обычно меняют Build.VERSION.RELEASE. - person Phuah Yee Keat; 05.08.2016
comment
Когда дело доходит до Custom OS / Roms, существует множество известных проблем. В версии, которая была у меня на моем старом Android в то время (я хочу сказать GS3), была эта проблема. Было много проблем с жестко запрограммированными значениями или значениями, которые были не просто правильными. Жесткий пример: адреса Mac Wi-Fi жестко запрограммированы. - person Falcon165o; 14.10.2016
comment
Если разработчики пользовательских ПЗУ намеренно меняют сигнатуры Android API, то они намеренно саботируют их. - person Dielson Sales; 06.05.2020

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

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

Принимая во внимание все сказанное, вот код, который я использую для определения, есть ли на устройстве 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;
}

Очевидно, вы можете изменить это условие if, чтобы учесть версии 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;
    }
}

Сообщите мне, если код вам не подходит.

person nikib3ro    schedule 27.07.2012

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

person jvdneste    schedule 06.08.2010
comment
Этот метод устарел. - person Adi; 15.12.2018

SDK.INT поддерживается для Android 1.6 и более поздних версий.

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

So I do:

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

Кредиты для: CommonsWare по этому ответ

person PYK    schedule 30.10.2019
comment
SDK устарел в Java. - person limonik; 26.03.2020
comment
@limonik Вы правы, SDK существует с уровня API 1, но он устарел на уровне API 15 - person PYK; 06.10.2020

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

person Parth Mehta    schedule 06.08.2010
comment
Это даст вам minSdkVersion и targetSdkVersion APK, который описывает, какие версии API поддерживает приложение. Это не версия API телефона, на котором сейчас работает приложение. - person OldSchool4664; 03.11.2016

Обычно я предпочитаю добавлять эти коды в функцию для получения версии Android:

int whichAndroidVersion;

whichAndroidVersion= Build.VERSION.SDK_INT;
textView.setText("" + whichAndroidVersion); //If you don't use "" then app crashes.

Например, этот код выше установит текст в моем textView как 29.

person Bay    schedule 15.01.2021

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

  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();
}
person alex    schedule 14.05.2014

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

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;
}
person alex    schedule 14.05.2014

Нравится:

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

Убедитесь, что ваш импортный пакет правильный (import package your_application_package_name, иначе он не будет работать должным образом).

person Keshav Gera    schedule 09.05.2019