Programmgesteuertes Abrufen der Android-API-Version


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


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

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;

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.


29

Versuche dies:

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


Diese Methode ist veraltet.
Adi

4

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


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


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

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


-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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.