Програмне забезпечення для версії 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.