Програмне забезпечення для версії Android API


581

Чи є спосіб отримати версію API, що телефон зараз працює?


62
@SteveHaley Ми зазвичай вважаємо, що те, що спочатку стає не дублікатом того, що з’являється пізніше.
— rds

5
Можливий дублікат Як отримати версію Android sdk?
— taocp

Відповіді:


1067

Як описано в документації на 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;

Це дасть вам фактичну кількість вашої версії; aka 2.3.3 або 2.2. Проблема з використанням Build.VERSION.SDK_INT полягає в тому, що якщо у вас є вкорінений телефон або користувальницький rom, у вас може бути нестандартна ОС (він же андроїд працює під керуванням 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є станом для об'єкта, тому його збірка або ВЕРСІЯ може бути nullтеоретично, але в такому випадку не тільки, SDK_INTале RELEASEі спричинить NPE. SDK_INT, ймовірно, може спричинити "Немає такого винятку з методу" або щось подібне, але не буде нульовим або NPE. Якщо тільки користувальницький ROM порушує документи та метод, оголошений як public static final Integer SDK_INT. Я просто намагаюся визначити характер проблеми, щоб вирішити проблему.
— Стен

3
Чи може хтось перевірити, чи так це насправді? У коментарі Стен досить чітко видно, що нульове неможливе. І звичайні Android-ROM / ОС, безумовно, повинні походити з якоїсь версії версії? Тож напевно Build.VERSION.SDK_INT має це відображати?
— BT

3
Я спростував це, оскільки претензія насправді не є резервною копією, і попередження про nullце не має сенсу.
— Сем

Корінний телефон або користувальницькі диски ніколи не повинні торкатися цього номера. Зазвичай вони змінюють Build.VERSION.RELEASE.
— Phuah Yee Keat

Існує багато відомих проблем, коли мова заходить про власні ОС / Роми. Версія, яку я мав на моєму старшому Android в той час (хочу сказати, GS3), мала цю проблему. Було багато проблем із твердо кодованими значеннями або значеннями, які були не просто правильними. Важкий приклад: Wi-Fi Mac адреси з жорстким кодом.
— 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;
}

Очевидно, ви можете змінити це, якщо за умови враховувати 1.0 та 1.5 версії Android, якщо вам потрібна загальна перевірка. Ви, мабуть, закінчите щось подібне:

// 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


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.