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_CODES
classe.
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) .
minSdkVersion
su 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_INT
e public static final int SDK_INT
e Added in API level 4
come potrebbe int (non intero) di ritorno NULL
? NULL
è uno stato per un oggetto, quindi la sua Build o VERSION potrebbe essere null
teoricamente, ma in tal caso non solo SDK_INT
ma RELEASE
anche 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.
null
non 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 Context
classe.
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;
}