Wie kann ich die Systemversion von Android überprüfen?

494

Wer weiß , wie kann ich die Systemversion überprüfen (zB 1.0, 2.2usw.) programmatisch?

Davs
quelle
Gibt

Antworten:

420

Überprüfen Sie android.os.Build.VERSION.

  • CODENAME: Der aktuelle Entwicklungs-Codename oder die Zeichenfolge "REL", wenn dies ein Release-Build ist.
  • INCREMENTAL: Der interne Wert, der von der zugrunde liegenden Quellcodeverwaltung zur Darstellung dieses Builds verwendet wird.
  • RELEASE: Die vom Benutzer sichtbare Versionszeichenfolge.
Robby Pond
quelle
72
Irgendwelche Beispiele, wie man es benutzt?
Jonathan
1
Der schwierige Teil dabei ist, dass SDK_INT in API Level 4 definiert wurde und die Verwendung auf 1-3 fehlschlägt. Weiß jemand, wie man damit gut umgeht?
Zordid
SDK ist seit API 1 verfügbar, auch INCREMENTAL ist für alle Versionen verfügbar.
Nuala
1
Build.VERSION.RELEASE ist ein String, daher können Sie diesen String verwenden, wie Sie möchten.
Paiego
8
Keine Sorge, nicht einmal Höhlenmenschen verwenden heute die Android-APIs 1-3. @ Zordid
Josh
811

Beispiel für die Verwendung:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only for gingerbread and newer versions
}
Atom
quelle
24
Ich ignoriere jede ältere Version als Eclair (7), Android 2.1 und sehr bald stellen wir auch die Unterstützung für 2.1 ein. Sie können jedoch das SDK anstelle von SDK_INT verwenden.
Am
12
SDK wurde in API-Ebene 4 dekäkiert. Verwenden Sie stattdessen SDK_INT.
Erdomester
Ich habe eine Frage: Wenn es auf einem System läuft, das älter als GINGERBREAD ist, können wir android.os.Build.VERSION_CODES.GINGERBREAD nicht erhalten. Wird die App abstürzen?
HongchaoZhang
Nein, denn GINGERBREAD wird während des Java-Builds durch nur die Nummer ersetzt. Es ist nur erforderlich, eine größere Kompilierungsversion von Android zu verwenden.
Am
97

Build.Version ist der Ort, an den diese Daten gehen. Hier ist ein Code-Snippet zum Formatieren.

public String getAndroidVersion() {
    String release = Build.VERSION.RELEASE;
    int sdkVersion = Build.VERSION.SDK_INT;
    return "Android SDK: " + sdkVersion + " (" + release +")";
}

Sieht so aus "Android SDK: 19 (4.4.4)"

jpotts18
quelle
63
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 einer 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 auf jeden Fall!

Falcon165o
quelle
Aus dem SDK: "Die vom Benutzer sichtbare Versionszeichenfolge. ZB" 1.0 "oder" 3.4b5 "." .... "3.4b5" Wie kann ich feststellen, um welche Versionsnummer es sich handelt?
Davs
Die ganze Antwort 2.3.3 ist die Versionsnummer oder 2.2 oder 2.3.5 (benutzerdefinierte Rom in meinem Fall). Das ist die Versionsnummer des Betriebssystems als Ganzes.
Falcon165o
Es wird dasselbe zurückgegeben: Menü >> Einstellungen >> Über das Telefon. Es sollte als Firmware-Version oder etwas Ähnliches gekennzeichnet sein.
Falcon165o
58
Wie zum Teufel könnte ein Int eine Null zurückgeben? SDK_INT ist ein primitiver Int.
Zsolt Safrany
57

Verwenden Sie diesen Code, um die Geräteversion zu überprüfen, die größer oder gleich Marshmallow ist.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){

    }

Um andere
zu überprüfen, ändern Sie einfach die VERSION_CODES wie K für Kitkat,
L für Loolipop N für Nougat und so weiter ...

Paulcab
quelle
48

Die Android-Version finden Sie unter Build.VERSION.

In der Dokumentation wird empfohlen, Build.VERSION.SDK_INTdie Werte in zu überprüfen Build.VERSION_CODES.

Dies ist in Ordnung, solange Sie feststellen, dass dies Build.VERSION.SDK_INTnur in API Level 4 eingeführt wurde, dh Android 1.6 (Donut). Dies hat also keine Auswirkungen auf Sie. Wenn Sie jedoch möchten, dass Ihre App unter Android 1.5 oder früher ausgeführt wird, müssen Sie Build.VERSION.SDKstattdessen die veraltete App verwenden.

Dave Webb
quelle
30

Ich kann die Antworten nicht kommentieren, aber Kaushiks Antwort enthält einen großen Fehler: SDK_INT ist nicht mit der Systemversion identisch, bezieht sich jedoch auf die API-Ebene.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
    //this code will be executed on devices running ICS or later
}

Der Wert Build.VERSION_CODES.ICE_CREAM_SANDWICHist 14. 14 ist die API-Stufe von Ice Cream Sandwich, während die Systemversion 4.0 ist. Wenn Sie also 4.0 schreiben, wird Ihr Code auf allen Geräten ab Donut ausgeführt, da 4 die API-Ebene von Donut ist ( Build.VERSION_CODES.DONUTentspricht 4).

if(Build.VERSION.SDK_INT >= 4.0){
    //this code will be executed on devices running on DONUT (NOT ICS) or later
}

Dieses Beispiel ist ein Grund, warum die Verwendung von "magischen Zahlen" eine schlechte Angewohnheit ist.

Michał Kisiel
quelle
7
Tatsächlich ist Build.VERSION.SDK_INT die API-Ebene und nicht der Versionscode. Die richtige Linie wäre alsoif(Build.VERSION.SDK_INT >= 15){
erdomester
Was wäre, wenn ich Ihnen sagen würde, dass der Versionscode dem API-Level entspricht und das SDK_INT von ICE_CREAM_SANDWICH 14 und nicht 15 ist? @erdomester
Beyondo
19

Zum Beispiel funktioniert eine Funktion nur für api21 up. Im Folgenden beheben wir Fehler in api21 down

    if(Build.VERSION.SDK_INT >= 21) {
    //only api 21 above
    }else{
   //only api 21 down
    }
HOSHYAR Ahmadpour
quelle
19

Beachten Sie, dass Build.VERSION.SDK_INT nicht zuverlässig ist. Es wird von @ Falcon165o erwähnt, und kürzlich bin ich auch auf dieses gestoßen .

Um die String-Daten (basierend auf der Android-Versionsliste ) des aktuell installierten Android zu erhalten, habe ich einen Code wie den folgenden erstellt:

Java

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

Beispiel für eine Ausgabe, die es erzeugt:

Marshmallow v6.0, API-Level: 23

Nikita Kurtin
quelle
1
Dieser Code stürzt bei Double.parseDouble (Build.VERSION.RELEASE) ab, wenn die Version mehr als einen Punkt enthält. Zum Beispiel 7.1.1
Miklós Keresztes
@ MiklósKeresztes Vielen Dank für den informativen Kommentar - Ich habe meine Antwort korrigiert.
Nikita Kurtin
7
if (Build.VERSION.SDK_INT >= ApiHelper.VERSION_CODES.HONEYCOMB_MR2) {
//do anything you  like.
}
Kunkun Liu
quelle
Könnten Sie bitte Ihre Antwort näher erläutern und etwas mehr Beschreibung der von Ihnen bereitgestellten Lösung hinzufügen?
Abarisone
3

Verwenden Sie diese Klasse

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;
    }
}
Basheer AL-MOMANI
quelle
3

Verwenden Sie diese Methode:

 public static String getAndroidVersion() {
        String versionName = "";

        try {
             versionName = String.valueOf(Build.VERSION.RELEASE);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return versionName;
    }
Manoj Tarkar
quelle
Wie wird das helfen?
Samuel Owino
1

Vorausgesetzt, Sie haben bashauf Ihrem Android-Gerät, können Sie diese Bash-Funktion verwenden:

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
}
SebMa
quelle