Jak mogę sprawdzić wersję systemową Androida?


494

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


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.

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
}

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)”


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!


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


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 .


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.


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
    }

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


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.
}

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

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

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
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.