Programowe pobieranie wersji interfejsu API Androida


Odpowiedzi:


1067

Zgodnie z opisem w dokumentacji systemu Android poziom SDK (liczba całkowita), w którym działa telefon, jest dostępny w:

android.os.Build.VERSION.SDK_INT

Klasa odpowiadająca temu int jest w android.os.Build.VERSION_CODESklasie.

Przykład kodu:

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
}

Edycja : Ten SDK_INT jest dostępny od wersji Donut (Android 1.6 / API4), więc upewnij się, że twoja aplikacja nie jest kompatybilna z Cupcake (Android 1.5 / API3), gdy go używasz, bo inaczej aplikacja się zawiesi (dzięki Programmer Bruce za precyzję) .

Odpowiednia dokumentacja Androida znajduje się tutaj i tutaj


18
Jeśli kod działa w wersji 1.5, odwołanie się do SDK_INT spowoduje zgłoszenie wyjątku, ponieważ został wprowadzony w API 4. (Tak, możesz uruchomić APK skompilowany z kodem API 4 w wersji 1.5. I tak, po osiągnięciu tego kodu API 4 , generuje wyjątek.)
— programista Bruce

@ProgrammerBruce jak zapobiec awarii? Lub jak nie być kompatybilny retro?
— Cœur

1
@ Cœur Myślę, że budowanie aplikacji retro kompatybilnej z Androidem 1.5 nie jest w dzisiejszych czasach naprawdę przydatne. Po prostu ustaw swój projekt minSdkVersionna 4(Android 1.6) i kontynuuj.
— ol_v_er

Dlaczego zamiast tego nie użyć łańcucha Android.os.Build.VERSION.SDK ? Działa na wszystkich wersjach Androida
— PYK

@PYK Ten atrybut android.os.Build.VERSION.SDK jest przestarzały, więc nie należy go używać. developer.android.com/reference/android/os/…
— ol_v_er

146

Bardzo łatwe:

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

Wynik:

E/MyActivity:   manufacturer ManufacturerX
                model SM-T310 
                version 19 
                versionRelease 4.4.2

2
Build.VERSION.RELEASE jest tym, czego szukałem. Dzięki @CommonSenseCode
— axierjhtjz

81
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ć niestandardowy system operacyjny (inaczej mój Android działa 2.3.5), który zwróci wartość null podczas korzystania z Build.VERSION.SDK_INT więc Build.VERSION.RELEASE będzie działać bez względu na standardową wersję Androida lub nie!

Aby go użyć, możesz po prostu to zrobić;

String androidOS = Build.VERSION.RELEASE;

9
Zgodnie z docs int android.os.Build.VERSION.SDK_INTi public static final int SDK_INTi Added in API level 4jak można int (nie Integer) powrót NULL? NULLjest stanem obiektu, więc jego Kompilacja lub WERSJA mogłaby być nullteoretycznie, ale w takim przypadku nie tylko, SDK_INTale RELEASErównież spowoduje NPE. SDK_INT prawdopodobnie może powodować „Brak takiego wyjątku metody” lub coś w tym rodzaju, ale nie zerowy lub NPE. Jeśli tylko niestandardowa pamięć ROM zepsuje dokumenty, a metoda zadeklarowana jako public static final Integer SDK_INT. Próbuję tylko ustalić naturę problemu, aby dokonać obejścia.
— Stan

3
Czy ktoś może zweryfikować, czy tak jest w rzeczywistości? Komentarz Stana wyraźnie pokazuje, że zerowanie nie jest możliwe. A czy niestandardowe ROM / OS Androida z pewnością muszą pochodzić z jakiegoś kompilacji wersji? Więc na pewno Build.VERSION.SDK_INT powinien to odzwierciedlać?
— BT

3
Głosowałem za tym, ponieważ roszczenie nie zostało w rzeczywistości poparte, a ostrzeżenie o nim nullnie ma sensu.
— Sam

Zrootowany telefon lub niestandardowe ROMy nigdy nie powinny dotykać tego numeru. Zwykle jednak zmieniają Build.VERSION.RELEASE.
— Phuah Yee Keat,

Istnieje wiele znanych problemów dotyczących niestandardowych systemów operacyjnych / Romów. Wersja, którą miałem na moim starszym Androidzie w tym czasie (chcę powiedzieć GS3) miała ten problem. Wystąpiło wiele problemów z zakodowanymi wartościami lub wartościami, które nie były po prostu poprawne. Twardy przykład, adresy Mac Wi-Fi są zakodowane na stałe.
— Falcon165o

31

Biorąc pod uwagę wszystkie powiedziane, oto kod, którego używam do wykrywania, czy urządzenie ma Froyo lub nowszy system operacyjny 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;
}

Oczywiście możesz to zmienić, jeśli uwzględnisz wersje Androida 1.0 i 1.5, jeśli potrzebujesz ogólnego kontrolera. Prawdopodobnie skończysz z czymś takim:

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

Daj mi znać, jeśli kod nie działa dla Ciebie.


29

Spróbuj tego:

 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 powinien dać ci wartość poziomu API. Możesz łatwo znaleźć mapowanie z poziomu interfejsu API na wersję Androida w dokumentacji Androida. Uważam, że 8 to 2.2, 7 to 2.1 i tak dalej.


Ta metoda jest przestarzała.
— Adi

4

Rozumiem. Wykorzystuje getApplicationInfo()metodę Contextklasy.


1
Otrzymasz minSdkVersion i targetSdkVersion APK, który opisuje, które wersje API obsługuje aplikacja. To nie jest wersja interfejsu API telefonu, na którym aplikacja jest obecnie uruchomiona.
— OldSchool4664,

2

SDK.INT jest obsługiwany dla Androida 1.6 i nowszych

SDK jest obsługiwany dla wszystkich wersji

Ja również:

String sdk_version_number = android.os.Build.VERSION.SDK;

Kredyty dla: Commons Zastanów się nad tą odpowiedzią


SDK jest przestarzałe w Javie.
— limonik

0

wolę mieć wersję jako numer, aby łatwiej ją sprzedawać, niż napisałem:

  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

Jego działanie Happy Coding

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

Uwaga Upewnij się, że pakiet importu jest poprawny (pakiet importu nazwa pakietu aplikacji, w przeciwnym razie nie będzie działał poprawnie)


-2

Poprawiłem używany kod

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