Получение версии 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 здесь и здесь

ol_v_er
источник
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
CommonSenseCode
источник
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;
Falcon165o
источник
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;
    }
}

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

nikib3ro
источник
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 и так далее.

jvdneste
источник
Этот метод устарел.
Ади
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 за этот ответ

PYK
источник
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;
}
Алекс
источник