Jak mogę sprawdzić wersję systemową Androida?

494

Czy ktoś wie jak mogę sprawdzić wersję systemu (np 1.0, 2.2itp) programowo?

DAVS
źródło
czy istnieje skrót (fragment kodu lub szablon na żywo), aby dodać tę kontrolę w studio Android
Basheer AL-MOMANI

Odpowiedzi:

420

Sprawdzić android.os.Build.VERSION.

  • CODENAME: Bieżąca nazwa kodowa programowania lub ciąg „REL”, jeśli jest to kompilacja wydania.
  • INCREMENTAL: Wewnętrzna wartość używana przez podstawową kontrolę źródła do reprezentowania tej kompilacji.
  • RELEASE: Ciąg wersji widoczny dla użytkownika.
Robby Pond
źródło
72
jakieś przykłady, jak go używać?
Jonathan
1
Trudność polega na tym, że SDK_INT został zdefiniowany na poziomie API 4 i korzystanie z niego kończy się niepowodzeniem na 1-3. Czy ktoś wie, jak sobie z tym poradzić?
Zordid
SDK jest dostępny od API 1, również INCREMENTAL jest dostępny dla wszystkich wersji.
nuala
1
Build.VERSION.RELEASE jest łańcuchem, dlatego możesz go używać w dowolny sposób.
paiego,
8
Nie martw się, nawet jaskiniowcy używają dziś interfejsów API Androida 1-3. @Zordid
Josh
811

Przykład jak z niego korzystać:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only for gingerbread and newer versions
}
Atom
źródło
24
Całkowicie ignoruję każdą starszą wersję niż Eclair (7), Android 2.1 i wkrótce przestajemy także obsługiwać wersję 2.1. Ale możesz użyć SDK zamiast SDK_INT.
ATom
12
Pakiet SDK został wycofany na poziomie API 4. Zamiast tego należy użyć SDK_INT.
erdomester
Mam pytanie: jeśli działa na systemie starszym niż GINGERBREAD, to nie możemy uzyskać android.os.Build.VERSION_CODES.GINGERBREAD, czy aplikacja się zawiesi?
HongchaoZhang
Nie, ponieważ GINGERBREAD zostanie zastąpiony tylko liczbą podczas kompilacji Java. Konieczne jest tylko użycie większej kompilowanej wersji Androida.
ATom
97

Build.Version to miejsce, w którym można znaleźć te dane. Oto fragment kodu, w jaki sposób go sformatować.

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

Wygląda na to, że „Android SDK: 19 (4.4.4)”

jpotts18
źródło
63
Build.VERSION.RELEASE;

To da ci rzeczywiste numery twojej wersji; alias 2.3.3 lub 2.2. Problem z używaniem Build.VERSION.SDK_INT polega na tym, że jeśli masz zrootowany telefon lub niestandardowy ROM, możesz mieć brak standardowego systemu operacyjnego (inaczej mój Android działa 2.3.5), a to zwróci wartość zerową podczas korzystania z Build.VERSION.SDK_INT więc Build.VERSION.RELEASE będzie działać bez względu na wszystko!

Falcon165o
źródło
Z zestawu SDK: „Ciąg wersji widoczny dla użytkownika. Np.„ 1.0 ”lub„ 3.4b5 ”.” .... „3.4b5” jak mogę ustalić, który to numer wersji?
davs,
Cała odpowiedź 2.3.3 to numer wersji lub 2.2 lub 2.3.5 (niestandardowy ROM w moim przypadku). To jest numer wersji systemu operacyjnego jako całości.
Falcon165o
Zwraca to samo Menu >> Ustawienia >> Informacje o telefonie. Powinien być oznaczony jako Wersja oprogramowania układowego lub coś w tym stylu.
Falcon165o
58
Jak, do diabła, int mógł zwrócić wartość zerową? SDK_INT jest prymitywnym int.
Zsolt Safrany
57

Aby sprawdzić wersję urządzenia, która jest większa lub równa Marshmallow, użyj tego kodu.

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

    }

do sprawdzania innych wystarczy zmienić VERSION_CODES jak,
K dla kitkat,
L dla loolipop N dla Nougat i tak dalej ...

paulcab
źródło
48

Możesz sprawdzić wersję Androida, patrząc Build.VERSION.

Dokumentacja zaleca sprawdzenie Build.VERSION.SDK_INTwartości w Build.VERSION_CODES.

Jest to w porządku, o ile zdajesz sobie sprawę, że Build.VERSION.SDK_INTzostało wprowadzone tylko w API Poziom 4, czyli Android 1.6 (Donut). Nie wpłynie to na ciebie, ale jeśli chcesz, aby Twoja aplikacja działała na Androidzie 1.5 lub wcześniejszym, musisz Build.VERSION.SDKzamiast tego użyć przestarzałego .

Dave Webb
źródło
30

Nie mogę komentować odpowiedzi, ale w odpowiedzi Kaushika istnieje ogromny błąd: SDK_INT nie jest tym samym co wersja systemowa, ale w rzeczywistości odnosi się do poziomu API.

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

Wartość Build.VERSION_CODES.ICE_CREAM_SANDWICHwynosi 14. 14 to poziom API Ice Cream Sandwich, podczas gdy wersja systemowa to 4.0. Więc jeśli napiszesz 4.0, twój kod zostanie wykonany na wszystkich urządzeniach, zaczynając od Donut, ponieważ 4 to poziom API Donut ( Build.VERSION_CODES.DONUTrówny 4).

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

Ten przykład jest powodem, dla którego używanie „magicznej liczby” jest złym nawykiem.

Michał Kisiel
źródło
7
W rzeczywistości Build.VERSION.SDK_INT to poziom interfejsu API, a nie kod wersji. Tak więc właściwą linią byłobyif(Build.VERSION.SDK_INT >= 15){
erdomester
Co jeśli powiem ci, że kod wersji jest taki sam jak poziom API, a SDK_INT z ICE_CREAM_SANDWICH to 14, a nie 15? @erdomester
Beyondo,
19

Na przykład funkcja działa tylko dla api21 w górę po tym, jak naprawiliśmy błędy w api21 w dół

    if(Build.VERSION.SDK_INT >= 21) {
    //only api 21 above
    }else{
   //only api 21 down
    }
HOSHYAR Ahmadpour
źródło
19

Pamiętaj, że Build.VERSION.SDK_INT nie jest niezawodny, wspomina o tym Falcon165o, a ostatnio też na to wpadłem.

Aby uzyskać dane String (na podstawie listy wersji Androida ) obecnie zainstalowanego Androida, stworzyłem taki kod:

Jawa

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

Kotlin

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
}

Przykład generowanego przez niego wyniku:

Marshmallow v6.0, Poziom API: 23

Nikita Kurtin
źródło
1
Ten kod ulega awarii w Double.parseDouble (Build.VERSION.RELEASE), gdy wydanie zawiera więcej niż jedną kropkę. Na przykład 7.1.1
Miklós Keresztes
@ MiklósKeresztes Dziękuję za pouczający komentarz - Naprawiłem swoją odpowiedź.
Nikita Kurtin,
7
if (Build.VERSION.SDK_INT >= ApiHelper.VERSION_CODES.HONEYCOMB_MR2) {
//do anything you  like.
}
Kunkun Liu
źródło
Czy mógłby Pan uściślić swoją odpowiedź, dodając nieco więcej opisu oferowanego rozwiązania?
abarisone
3

użyj tej klasy

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;
    }
}
Basheer AL-MOMANI
źródło
3

Użyj tej metody:

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

        try {
             versionName = String.valueOf(Build.VERSION.RELEASE);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return versionName;
    }
Manoj Tarkar
źródło
Jak to pomoże?
samuel owino
1

Biorąc pod uwagę, że masz bashna swoim urządzeniu z Androidem, możesz użyć tej funkcji 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
}
SebMa
źródło