Esiste un modo per ottenere la versione dell'API attualmente in esecuzione sul telefono?
Esiste un modo per ottenere la versione dell'API attualmente in esecuzione sul telefono?
Risposte:
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) .
minSdkVersionsu 4(Android 1.6) e continuare.
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
);
E/MyActivity: manufacturer ManufacturerX
model SM-T310
version 19
versionRelease 4.4.2
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;
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.
nullnon ha senso.
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.
prova questo:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
// only for gingerbread and newer versions
}
Fatto. Sta usando il getApplicationInfo()metodo della Contextclasse.
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
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();
}
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)
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;
}