Programowe pobieranie wersji interfejsu API Androida

581

Czy jest jakiś sposób, aby uzyskać wersję interfejsu API, na której telefon aktualnie działa?

Parth Mehta
źródło
62
@SteveHaley Zwykle uważamy, że coś, co jest pierwsze, nie jest duplikatem czegoś, co pojawia się później.
rds
5
możliwy duplikat Jak pobrać wersję Android SDK?
taocp

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

ol_v_er
źródło
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
CommonSenseCode
źródło
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;
Falcon165o
źródło
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.

nikib3ro
źródło
29

Spróbuj tego:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only for gingerbread and newer versions
 }
Khalid Taha
źródło
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.

jvdneste
źródło
Ta metoda jest przestarzała.
Adi
4

Rozumiem. Wykorzystuje getApplicationInfo()metodę Contextklasy.

Parth Mehta
źródło
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ą

PYK
źródło
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();
}
alex
źródło
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)

Keshav Gera
źródło
-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;
}
alex
źródło