Programmgesteuertes Abrufen der Android-API-Version

581

Gibt es eine Möglichkeit, die API-Version abzurufen, auf der das Telefon gerade ausgeführt wird?

Parth Mehta
quelle
62
@SteveHaley Wir denken normalerweise, dass etwas, das zuerst kommt, kein Duplikat von etwas ist, das später erscheint.
rds
5
mögliches Duplikat von Wie kann man die Android SDK-Version abrufen?
Taocp

Antworten:

1067

Wie in der Android-Dokumentation beschrieben, ist die SDK-Ebene (Ganzzahl), auf der das Telefon ausgeführt wird, verfügbar in:

android.os.Build.VERSION.SDK_INT

Die diesem int entsprechende Klasse befindet sich in der android.os.Build.VERSION_CODESKlasse.

Codebeispiel:

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
}

Bearbeiten : Dieses SDK_INT ist seit Donut (android 1.6 / API4) verfügbar. Stellen Sie daher sicher, dass Ihre Anwendung nicht mit Cupcake (android 1.5 / API3) retro-kompatibel ist, wenn Sie es verwenden, da Ihre Anwendung sonst abstürzt (danke an Programmer Bruce für die Präzision). .

Die entsprechende Android-Dokumentation finden Sie hier und hier

ol_v_er
quelle
18
Wenn der Code unter 1.5 ausgeführt wird, löst das Verweisen auf SDK_INT eine Ausnahme aus, da es mit API 4 eingeführt wurde. (Ja, Sie können ein mit API 4-Code kompiliertes APK unter 1.5 ausführen. Und ja, wenn dieser API 4-Code erreicht ist , es wirft eine Ausnahme.)
Programmierer Bruce
@ProgrammerBruce Wie kann man den Absturz verhindern? Oder wie man nicht retro-kompatibel ist?
Cœur
1
@ Cœur Ich denke, das Erstellen einer Retro-App, die mit Android 1.5 kompatibel ist, ist heutzutage nicht wirklich nützlich. Stellen Sie einfach Ihr Projekt minSdkVersionauf 4(Android 1.6) und fahren Sie fort.
ol_v_er
Warum nicht stattdessen den String android.os.Build.VERSION.SDK verwenden? Es funktioniert für alle Android-Versionen
PYK
@PYK Dieses Attribut android.os.Build.VERSION.SDK ist veraltet und sollte daher nicht verwendet werden. developer.android.com/reference/android/os/…
ol_v_er
146

Sehr leicht:

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

Ausgabe:

E/MyActivity:   manufacturer ManufacturerX
                model SM-T310 
                version 19 
                versionRelease 4.4.2
CommonSenseCode
quelle
2
Build.VERSION.RELEASE ist das, wonach ich gesucht habe. Danke @CommonSenseCode
axierjhtjz
81
Build.VERSION.RELEASE;

Das gibt Ihnen die tatsächlichen Nummern Ihrer Version; aka 2.3.3 oder 2.2. Das Problem bei der Verwendung von Build.VERSION.SDK_INT besteht darin, dass Sie bei einem gerooteten Telefon oder einem benutzerdefinierten ROM möglicherweise ein nicht standardmäßiges Betriebssystem haben (auch bekannt als mein Android läuft 2.3.5), das bei Verwendung von Build.VERSION.SDK_INT eine Null zurückgibt Build.VERSION.RELEASE funktioniert also unabhängig von der Standard-Android-Version oder nicht!

Um es zu benutzen, könnten Sie dies einfach tun;

String androidOS = Build.VERSION.RELEASE;
Falcon165o
quelle
9
Laut docs int android.os.Build.VERSION.SDK_INTund public static final int SDK_INTund Added in API level 4wie könnte int (nicht Integer) zurückkehren NULL? NULList ein Zustand für ein Objekt, so dass sein Build oder seine VERSION nulltheoretisch sein könnte, aber in diesem Fall nicht nur, SDK_INTsondern RELEASEauch eine NPE verursachen wird. SDK_INT könnte wahrscheinlich "Keine solche Methodenausnahme" oder ähnliches verursachen, aber nicht null oder NPE. Wenn nur ein benutzerdefiniertes ROM die Dokumente und die als deklarierte Methode beschädigt public static final Integer SDK_INT. Ich versuche nur, die Art eines Problems zu bestimmen, um eine Problemumgehung zu finden.
Stan
3
Kann jemand überprüfen, ob dies tatsächlich der Fall ist? Stans Kommentar macht ziemlich deutlich, dass null nicht möglich ist. Und benutzerdefinierte Android-ROMs / Betriebssysteme müssen sicherlich aus einer bestimmten Version stammen? Also sollte Build.VERSION.SDK_INT dies sicherlich widerspiegeln?
BT
3
Ich habe dies abgelehnt, da die Behauptung nicht wirklich gesichert ist und die Warnung darüber nullkeinen Sinn ergibt.
Sam
Rooted Phone oder Custom Roms sollten diese Nummer niemals berühren. Normalerweise ändern sie jedoch die Build.VERSION.RELEASE.
Phuah Yee Keat
Es gibt viele bekannte Probleme, wenn es um benutzerdefinierte Betriebssysteme / Roms geht. Die Version, die ich damals auf meinem älteren Android hatte (ich möchte sagen, GS3), hatte dieses Problem. Es gab viele Probleme mit fest codierten Werten oder Werten, die nicht nur korrekt waren. Hartes Beispiel: Wi-Fi-Mac-Adressen sind fest codiert.
Falcon165o
31

Unter Berücksichtigung aller genannten Punkte ist hier der Code, mit dem ich erkenne, ob das Gerät über Froyo oder ein neueres Android-Betriebssystem (2.2+) verfügt:

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

Natürlich können Sie diese Bedingung ändern, um die Versionen 1.0 und 1.5 von Android zu berücksichtigen, falls Sie einen generischen Prüfer benötigen. Sie werden wahrscheinlich so etwas haben:

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

Lassen Sie mich wissen, wenn der Code für Sie nicht funktioniert.

nikib3ro
quelle
29

Versuche dies:

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

android.os.Build.VERSION.SDK sollte Ihnen den Wert der API-Ebene geben. Sie können die Zuordnung von der API-Ebene zur Android-Version leicht in der Android-Dokumentation finden. Ich glaube, 8 steht für 2,2, 7 für 2,1 und so weiter.

jvdneste
quelle
Diese Methode ist veraltet.
Adi
4

Ich habs. Es verwendet die getApplicationInfo()Methode der ContextKlasse.

Parth Mehta
quelle
1
Dadurch erhalten Sie die minSdkVersion und targetSdkVersion des APK, in denen beschrieben wird, welche API-Versionen die App unterstützt. Dies ist nicht die API-Version des Telefons, auf dem die App derzeit ausgeführt wird.
OldSchool4664
2

SDK.INT wird für Android 1.6 und höher unterstützt

SDK wird für alle Versionen unterstützt

So ich mache:

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

Dank an: CommonsWare über diese Antwort

PYK
quelle
SDK in Java veraltet.
Limonik
0

Ich bevorzuge es, die Version als Nummer einfacher zu handhaben, als ich dies geschrieben habe:

  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
quelle
0

Es funktioniert Happy Coding

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

Hinweis Bitte stellen Sie sicher, dass Ihr Importpaket korrekt ist (importieren Sie das Paket mit dem Namen Ihres Anwendungspakets, sonst funktioniert es nicht richtig).

Keshav Gera
quelle
-2

Ich habe den von mir verwendeten Code verbessert

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
quelle