Як я можу перевірити системну версію Android?


494

Хто - небудь знає , як я можу перевірити версію системи (наприклад 1.0, 2.2і т.д.) програмно?


чи є ярлик (фрагмент коду або шаблон живого), щоб додати цю реєстрацію в студії Android
Basheer AL-MOMANI

Відповіді:


420

Перевірити android.os.Build.VERSION.

  • CODENAME: Поточне кодове ім'я розробки або рядок "REL", якщо це збірка релізу.
  • INCREMENTAL: Внутрішнє значення, яке використовується базовим контрольним джерелом для представлення цієї збірки.
  • RELEASE: Рядок версії, видима користувачеві.

72
будь-які приклади, як ним користуватися?
Джонатан

1
Важкою частиною цього є те, що SDK_INT був визначений у рівні API 4, а використання його не вдається на 1-3. Хтось знає, як добре з цим впоратися?
Зордід

SDK доступний з API 1, також INCREMENTAL доступний для всіх версій.
нуала

1
Build.VERSION.RELEASE - це рядок, тому ви можете використовувати цю струну, як завгодно.
paiego

8
Не хвилюйтеся, сьогодні навіть печерні люди не використовують андроїд API 1-3. @Zordid
Josh

811

Приклад використання ним:

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

24
Я повністю ігнорую будь-яку старішу версію, ніж Eclair (7), Android 2.1, і дуже скоро ми припиняємо також підтримку 2.1. Але ви можете використовувати SDK замість SDK_INT.
ATom

12
SDK залежав від рівня API 4. Використовуйте замість SDK_INT.
erdomester

У мене виникає питання: якщо він працює в системі, старшій за GINGERBREAD, тоді ми не можемо отримати android.os.Build.VERSION_CODES.GINGERBREAD, чи стане програма збою?
HongchaoZhang

Ні, адже GINGERBREAD замінить просто число під час збирання Java. Потрібно лише використовувати більшу компільовану версію Android.
Атом

97

Build.Version - це місце для цих даних. Ось фрагмент коду для того, як відформатувати його.

public String getAndroidVersion() {
    String release = Build.VERSION.RELEASE;
    int sdkVersion = Build.VERSION.SDK_INT;
    return "Android SDK: " + sdkVersion + " (" + release +")";
}

Виглядає так: "SDK для Android: 19 (4.4.4)"


63
Build.VERSION.RELEASE;

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


Від SDK: "Рядок версії, видима користувачеві. Наприклад," 1.0 "або" 3.4b5 "." .... "3.4b5" як я можу визначити, який номер версії?
Дави

Уся відповідь 2.3.3 - це номер версії, або 2.2, або 2.3.5 (у моєму випадку звичайний rom). Це номер версії ОС в цілому.
Falcon165o

Він повертає те саме, що меню >> Налаштування >> Про телефон. Він повинен мати позначку Версія мікропрограмного забезпечення або щось, що впливає на це.
Falcon165o

58
Як чорт міг повернути нуль? SDK_INT - примітивний int.
Zsolt Safrany

57

Для перевірки версії пристрою, яка більше або дорівнює Marshmallow, використовуйте цей код.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){

    }

для перевірки інших просто змініть VERSION_CODES, наприклад,
K для kitkat,
L для loolipop N для Nougat і так далі ...


48

Ви можете дізнатись, на якій версії Android ви дивитесь Build.VERSION.

Документація рекомендує перевірити Build.VERSION.SDK_INTзначення в Build.VERSION_CODES.

Це добре, доки ви розумієте, що він Build.VERSION.SDK_INTбув введений лише в API рівня 4, тобто Android 1.6 (Donut). Таким чином, це не вплине на вас, але якщо ви хочете, щоб ваш додаток працював на Android 1.5 або раніше, тоді вам доведеться використовувати застаріле Build.VERSION.SDK.


30

Я не можу коментувати відповіді, але у відповіді Каушика є величезна помилка: SDK_INT не є такою ж версією системи, але насправді стосується рівня API.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
    //this code will be executed on devices running ICS or later
}

Значення Build.VERSION_CODES.ICE_CREAM_SANDWICHдорівнює 14. 14 - рівень API морозива з морозивом, тоді як версія системи - 4,0. Отже, якщо ви пишете 4.0, ваш код буде виконуватися на всіх пристроях, починаючи з Donut, оскільки 4 - це рівень API Donut ( Build.VERSION_CODES.DONUTдорівнює 4).

if(Build.VERSION.SDK_INT >= 4.0){
    //this code will be executed on devices running on DONUT (NOT ICS) or later
}

Цей приклад є причиною того, що використання "магічного числа" є шкідливою звичкою.


7
Насправді Build.VERSION.SDK_INT - це рівень API, а не код версії. Тож правильна лінія була бif(Build.VERSION.SDK_INT >= 15){
ердоместер

Що робити, якщо я сказав вам код версії такий же, як рівень API, а SDK_INT ICE_CREAM_SANDWICH становить 14, а не 15? @erdomester
Beyondo

19

Наприклад, функція працює лише для api21. Наступним чином ми виправляємо помилки в api21 down

    if(Build.VERSION.SDK_INT >= 21) {
    //only api 21 above
    }else{
   //only api 21 down
    }

19

Будьте в курсі, що Build.VERSION.SDK_INT не є надійним, його згадує @ Falcon165o, і нещодавно я натрапив і на цей.

Отже, щоб отримати дані String (на основі списку версій Android ) наразі встановленого Android, я зробив такий код:

Java

//Current Android version data
public static String currentVersion(){
    double release=Double.parseDouble(Build.VERSION.RELEASE.replaceAll("(\\d+[.]\\d+)(.*)","$1"));
    String codeName="Unsupported";//below Jelly bean OR above Oreo
    if(release>=4.1 && release<4.4)codeName="Jelly Bean";
    else if(release<5)codeName="Kit Kat";
    else if(release<6)codeName="Lollipop";
    else if(release<7)codeName="Marshmallow";
    else if(release<8)codeName="Nougat";
    else if(release<9)codeName="Oreo";
    return codeName+" v"+release+", API Level: "+Build.VERSION.SDK_INT;
}

Котлін

fun currentVersion(): String {
    val release = java.lang.Double.parseDouble(java.lang.String(Build.VERSION.RELEASE).replaceAll("(\\d+[.]\\d+)(.*)", "$1"))
    var codeName = "Unsupported"//below Jelly bean OR above Oreo
    if (release >= 4.1 && release < 4.4)  codeName = "Jelly Bean"
    else if (release < 5) codeName = "Kit Kat"
    else if (release < 6) codeName = "Lollipop"
    else if (release < 7) codeName = "Marshmallow"
    else if (release < 8) codeName = "Nougat"
    else if (release < 9) codeName = "Oreo"
    return codeName + " v" + release + ", API Level: " + Build.VERSION.SDK_INT
}

Приклад результату, який він дає:

Marshmallow v6.0, рівень API: 23


1
Цей код виходить з ладу на Double.parseDouble (Build.VERSION.RELEASE), коли випуск містить більше однієї крапки. Наприклад 7.1.1
Міклош Керештес

@ MiklósKeresztes Дякую за інформативний коментар - я виправив свою відповідь.
Микита Куртін

7
if (Build.VERSION.SDK_INT >= ApiHelper.VERSION_CODES.HONEYCOMB_MR2) {
//do anything you  like.
}

Не могли б ви детальніше розглянути свою відповідь, додавши трохи більше опису про рішення, яке ви надаєте?
абарізон

3

використовувати цей клас

import android.os.Build;

/**
 * Created by MOMANI on 2016/04/14.
 */
public class AndroidVersionUtil {
    public static int getApiVersion() {
        return android.os.Build.VERSION.SDK_INT;
    }

    public static boolean isApiVersionGraterOrEqual(int thisVersion) {
        return android.os.Build.VERSION.SDK_INT >= thisVersion;
    }
}

3

Використовуйте цей метод:

 public static String getAndroidVersion() {
        String versionName = "";

        try {
             versionName = String.valueOf(Build.VERSION.RELEASE);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return versionName;
    }

Як це допоможе?
samuel Owino

1

З огляду на те, що у вас bashна пристрої Android, ви можете використовувати цю функцію bash:

function androidCodeName {
    androidRelease=$(getprop ro.build.version.release)
    androidCodeName=$(getprop ro.build.version.codename)

    # Time "androidRelease" x10 to test it as an integer
    case $androidRelease in
        [0-9].[0-9]|[0-9].[0-9].|[0-9].[0-9].[0-9])  androidRelease=$(echo $androidRelease | cut -d. -f1-2 | tr -d .);;
        [0-9].) androidRelease=$(echo $androidRelease | sed 's/\./0/');;
        [0-9]) androidRelease+="0";;
    esac

    [ -n "$androidRelease" ] && [ $androidCodeName = REL ] && {
    # Do not use "androidCodeName" when it equals to "REL" but infer it from "androidRelease"
        androidCodeName=""
        case $androidRelease in
        10) androidCodeName+=NoCodename;;
        11) androidCodeName+="Petit Four";;
        15) androidCodeName+=Cupcake;;
        20|21) androidCodeName+=Eclair;;
        22) androidCodeName+=FroYo;;
        23) androidCodeName+=Gingerbread;;
        30|31|32) androidCodeName+=Honeycomb;;
        40) androidCodeName+="Ice Cream Sandwich";;
        41|42|43) androidCodeName+="Jelly Bean";;
        44) androidCodeName+=KitKat;;
        50|51) androidCodeName+=Lollipop;;
        60) androidCodeName+=Marshmallow;;
        70|71) androidCodeName+=Nougat;;
        80|81) androidCodeName+=Oreo;;
        90) androidCodeName+=Pie;;
        100) androidCodeName+=ToBeReleased;;
        *) androidCodeName=unknown;;
        esac
    }
    echo $androidCodeName
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.