Recupero della versione dell'API Android a livello di codice


Risposte:


1068

Come descritto nella documentazione di Android, il livello SDK (numero intero) su cui è in esecuzione il telefono è disponibile in:

android.os.Build.VERSION.SDK_INT

La classe corrispondente a questo int è nella android.os.Build.VERSION_CODESclasse.

Esempio di codice:

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
}

Modifica : questo SDK_INT è disponibile da Donut (Android 1.6 / API4), quindi assicurati che la tua applicazione non sia retro-compatibile con Cupcake (Android 1.5 / API3) quando la usi o la tua applicazione andrà in crash (grazie al programmatore Bruce per la precisione) .

La documentazione Android corrispondente è qui e qui


18
Se il codice è in esecuzione su 1.5, il riferimento a SDK_INT genererà un'eccezione, poiché è stato introdotto con l'API 4. (Sì, è possibile eseguire un APK compilato con il codice API 4 su 1.5. E sì, quando viene raggiunto quel codice API 4 , fa eccezione.)
Programmatore Bruce

@ProgrammerBruce come prevenire l'incidente? O come non essere retro-compatibile?
Cœur il

1
@Cœur Penso che costruire un'app retro compatibile con Android 1.5 non sia molto utile al giorno d'oggi. Basta impostare il progetto minSdkVersionsu 4(Android 1.6) e continuare.
ol_v_er

Perché non usare invece la stringa android.os.Build.VERSION.SDK ? Funziona con tutte le versioni di Android
PYK il

@PYK Questo attributo android.os.Build.VERSION.SDK è obsoleto, quindi non deve essere utilizzato. developer.android.com/reference/android/os/…
ol_v_er

146

Molto facile:

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

Produzione:

E/MyActivity:   manufacturer ManufacturerX
                model SM-T310 
                version 19 
                versionRelease 4.4.2

2
Build.VERSION.RELEASE è quello che stavo cercando. Grazie @CommonSenseCode
axierjhtjz

81
Build.VERSION.RELEASE;

Questo ti darà i numeri effettivi della tua versione; alias 2.3.3 o 2.2. Il problema con l'utilizzo di Build.VERSION.SDK_INT è se si dispone di un telefono rootato o di una rom personalizzata, si potrebbe avere un sistema operativo non standard (ovvero il mio Android esegue 2.3.5) e che restituirà un valore null quando si utilizza Build.VERSION.SDK_INT quindi Build.VERSION.RELEASE funzionerà indipendentemente dalla versione standard di Android o no!

Per usarlo, potresti semplicemente farlo;

String androidOS = Build.VERSION.RELEASE;

9
Secondo documenti int android.os.Build.VERSION.SDK_INTe public static final int SDK_INTe Added in API level 4come potrebbe int (non intero) di ritorno NULL? NULLè uno stato per un oggetto, quindi la sua Build o VERSION potrebbe essere nullteoricamente, ma in tal caso non solo SDK_INTma RELEASEanche causerà un NPE. SDK_INT potrebbe probabilmente causare "Nessuna eccezione al metodo" o qualcosa del genere ma non null o NPE. Se solo la ROM personalizzata interrompe i documenti e il metodo dichiarato come public static final Integer SDK_INT. Sto solo cercando di determinare la natura di un problema per risolvere il problema.
Stan,

3
Qualcuno può verificare se questo è effettivamente il caso? Il commento di Stan chiarisce che non è possibile nulla. E le ROM / i sistemi operativi Android personalizzati devono sicuramente provenire da una versione di build? Quindi sicuramente Build.VERSION.SDK_INT dovrebbe riflettere questo?
BT,

3
Ho annullato il voto in quanto il reclamo non è realmente eseguito il backup e l'avvertimento in merito nullnon ha senso.
Sam,

Il telefono con rooting o le rom personalizzate non devono mai toccare questo numero. Di solito cambiano Build.VERSION.RELEASE però.
Phuah Yee Keat,

Ci sono molti problemi noti quando si tratta di sistemi operativi / Rom personalizzati. La versione che avevo sul mio vecchio Android all'epoca (voglio dire GS3) aveva quel problema. Ci sono stati molti problemi con valori hardcoded o valori che non erano corretti. Esempio concreto, indirizzi Mac Wi-Fi essendo codificati.
Falcon165o

31

Tenendo conto di tutto quanto detto, ecco il codice che uso per rilevare se il dispositivo ha Froyo o un nuovo sistema operativo 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;
}

Ovviamente, puoi modificarlo se la condizione tiene conto delle versioni 1.0 e 1.5 di Android nel caso in cui tu abbia bisogno di un controllo generico. Probabilmente finirai con qualcosa del genere:

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

Fammi sapere se il codice non funziona per te.


29

prova questo:

 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 dovrebbe darti il ​​valore del Livello API. Puoi facilmente trovare la mappatura dal livello API alla versione Android nella documentazione di Android. Credo che 8 sia per 2.2, 7 per 2.1 e così via.


Questo metodo è obsoleto.
Adi,

4

Fatto. Sta usando il getApplicationInfo()metodo della Contextclasse.


1
Questo ti porterà minSdkVersion e targetSdkVersion dell'APK, che descrive quali versioni API supportate dall'app. Questa non è la versione API del telefono su cui l'app è attualmente in esecuzione.
OldSchool4664,

2

SDK.INT è supportato per Android 1.6 e versioni successive

SDK è supportato per tutte le versioni

Faccio così:

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

Crediti a: CommonsWare su questa risposta


SDK deprecato in Java.
limonik,

0

preferisco avere la versione come numero da gestire più facilmente di quanto non abbia scritto questo:

  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

Funziona con la codifica felice

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

Nota Accertarsi che il pacchetto di importazione sia corretto (importare il nome del pacchetto dell'applicazione, altrimenti non funziona correttamente)


-2

Ho migliorato il codice che ho usato

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