Come posso verificare la versione di sistema di Android?


494

Qualcuno sa come posso controllare la versione del sistema (ad esempio 1.0, 2.2e così via) programatically?


c'è un collegamento (frammento di codice o modello live) per aggiungere questo controllo in Android Studio
Basheer AL-MOMANI

Risposte:


420

Controllare android.os.Build.VERSION.

  • CODENAME: Il nome in codice di sviluppo corrente o la stringa "REL" se si tratta di una build di rilascio.
  • INCREMENTAL: Il valore interno utilizzato dal controllo del codice sorgente sottostante per rappresentare questa build.
  • RELEASE: La stringa della versione visibile dall'utente.

72
qualche esempio su come usarlo?
Jonathan,

1
La parte difficile di questo è che SDK_INT è stato definito in API Level 4 e il suo utilizzo non riesce su 1-3. Qualcuno sa come gestirlo bene?
Zordid,

SDK è disponibile dall'API 1, anche INCREMENTAL è disponibile per tutte le versioni.
nuala,

1
Build.VERSION.RELEASE è una stringa, quindi puoi utilizzare questa stringa come preferisci.
paiego,

8
Non preoccuparti, nemmeno gli uomini delle caverne stanno usando le API Android 1-3 oggi. @Zordid
Josh,

811

Esempio come usarlo:

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

24
Ignoro totalmente qualsiasi versione precedente a Eclair (7), Android 2.1 e molto presto interrompiamo anche il supporto per la 2.1. Ma puoi usare l'SDK invece di SDK_INT.
ATom,

12
L'SDK è stato depecato nel livello API 4. Utilizzare invece SDK_INT.
Erdomester,

Ho una domanda: se è in esecuzione su un sistema precedente a GINGERBREAD, allora non possiamo ottenere android.os.Build.VERSION_CODES.GINGERBREAD, l'app si bloccherà?
HongchaoZhang,

No, perché GINGERBREAD verrà sostituito solo dal numero durante la compilazione di Java. È necessario solo utilizzare una versione di compilazione più grande di Android.
ATom,

97

Build.Version è il posto dove andare per questi dati. Ecco uno snippet di codice per come formattarlo.

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

Assomiglia a questo "Android SDK: 19 (4.4.4)"


63
Build.VERSION.RELEASE;

Questo ti darà i numeri effettivi della tua versione; aka 2.3.3 o 2.2. Il problema con l'uso di Build.VERSION.SDK_INT è che se hai un telefono rootato o una rom personalizzata, potresti avere un sistema operativo non standard (ovvero il mio Android esegue 2.3.5) e che restituirà un valore null quando usi Build.VERSION.SDK_INT quindi Build.VERSION.RELEASE funzionerà indipendentemente da cosa!


Da SDK: "La stringa di versione visibile dall'utente. Ad esempio," 1.0 "o" 3.4b5 "." .... "3.4b5" come posso determinare quale numero di versione è?
dav

L'intera risposta 2.3.3 è il numero di versione, o 2.2, o 2.3.5 (rom personalizzata nel mio caso). Questo è il numero di versione del sistema operativo nel suo insieme.
Falcon165o

Restituisce la stessa cosa Menu >> Impostazioni >> Informazioni sul telefono. Dovrebbe essere etichettato come versione del firmware o qualcosa del genere.
Falcon165o

58
Come diavolo potrebbe un int restituire un nulla? SDK_INT è un int primitivo.
Zsolt Safrany,

57

Per verificare la versione del dispositivo maggiore o uguale a Marshmallow, utilizzare questo codice.

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

    }

per controllare gli altri basta cambiare VERSION_CODES come,
K per kitkat,
L per loolipop N per Nougat e così via ...


48

Puoi scoprire la versione di Android guardando Build.VERSION.

La documentazione consiglia di verificare Build.VERSION.SDK_INTi valori in Build.VERSION_CODES.

Questo va bene finché ti rendi conto che è Build.VERSION.SDK_INTstato introdotto solo in API Level 4, vale a dire Android 1.6 (Ciambella). Quindi questo non ti influenzerà, ma se desideri che la tua app venga eseguita su Android 1.5 o precedenti, dovresti invece utilizzare il deprecato Build.VERSION.SDK.


30

Non posso commentare le risposte, ma c'è un grosso errore nella risposta di Kaushik: SDK_INT non è uguale alla versione di sistema ma si riferisce effettivamente al livello API.

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

Il valore è Build.VERSION_CODES.ICE_CREAM_SANDWICHpari a 14. 14 è il livello API di Ice Cream Sandwich, mentre la versione del sistema è 4.0. Quindi, se scrivi 4.0, il tuo codice verrà eseguito su tutti i dispositivi a partire da Donut, perché 4 è il livello API di Donut ( Build.VERSION_CODES.DONUTuguale a 4).

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

Questo esempio è un motivo per cui l'uso del "numero magico" è una cattiva abitudine.


7
In realtà, Build.VERSION.SDK_INT è il livello API, non il codice versione. Quindi la linea corretta sarebbeif(Build.VERSION.SDK_INT >= 15){
circa il

E se ti dicessi che il codice della versione è lo stesso del livello API e SDK_INT di ICE_CREAM_SANDWICH è 14 e non 15? @erdomester
Beyondo

19

Ad esempio, una funzione funziona solo per api21 in alto, di seguito correggiamo i bug in api21 in basso

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

19

Tieni presente che Build.VERSION.SDK_INT non è affidabile, è menzionato da @ Falcon165o e di recente mi sono imbattuto anche in quello.

Quindi, per ottenere i dati della stringa (in base all'elenco delle versioni di Android ) di Android attualmente installato, ho creato un codice come questo:

Giava

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

Esempio di output che produce:

Marshmallow v6.0, Livello API: 23


1
Questo codice si arresta in modo anomalo su Double.parseDouble (Build.VERSION.RELEASE) quando la versione contiene più di un punto. Ad esempio 7.1.1
Miklós Keresztes,

@ MiklósKeresztes Grazie per il commento informativo - Ho corretto la mia risposta.
Nikita Kurtin,

7
if (Build.VERSION.SDK_INT >= ApiHelper.VERSION_CODES.HONEYCOMB_MR2) {
//do anything you  like.
}

Potresti per favore elaborare di più la tua risposta aggiungendo un po 'più di descrizione sulla soluzione che offri?
Abarisone,

3

usa questa classe

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

3

Usa questo metodo:

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

        try {
             versionName = String.valueOf(Build.VERSION.RELEASE);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return versionName;
    }

Come sarà d'aiuto?
Samuel Owino,

1

Dato che hai bashsul tuo dispositivo Android, puoi usare questa funzione bash:

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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.