Existe alguma maneira de obter a versão da API que o telefone está executando no momento?
Existe alguma maneira de obter a versão da API que o telefone está executando no momento?
Respostas:
Conforme descrito na documentação do Android, o nível do SDK (número inteiro) que o telefone está executando está disponível em:
android.os.Build.VERSION.SDK_INT
A classe correspondente a este int está na android.os.Build.VERSION_CODESclasse
Exemplo de código:
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
}
Edit : Este SDK_INT está disponível desde o Donut (android 1.6 / API4), para garantir que seu aplicativo não seja retro-compatível com o Cupcake (android 1.5 / API3) quando você o usar ou o aplicativo falhará (obrigado ao programador Bruce pela precisão) .
minSdkVersionpara 4(Android 1.6) e continuar.
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;
Isso fornecerá os números reais da sua versão; tcp 2.3.3 ou 2.2. O problema com o uso do Build.VERSION.SDK_INT é que, se você tiver um telefone raiz ou uma ROM personalizada, poderá ter um sistema operacional não padrão (também conhecido como meu android está executando o 2.3.5) e que retornará um valor nulo ao usar o Build.VERSION.SDK_INT então Build.VERSION.RELEASE funcionará independentemente da versão padrão do Android ou não!
Para usá-lo, você poderia fazer isso;
String androidOS = Build.VERSION.RELEASE;
int android.os.Build.VERSION.SDK_INTe public static final int SDK_INTe Added in API level 4como poderia int (não Integer) retorno NULL? NULLé um estado para um objeto, portanto sua Build ou VERSION pode ser nullteoricamente, mas nesse caso, não apenas SDK_INTmas RELEASEtambém causará um NPE. O SDK_INT provavelmente poderia causar "Nenhuma exceção desse método" ou algo parecido, mas não nulo ou NPE. Se apenas a ROM personalizada quebrar os documentos e o método declarado como public static final Integer SDK_INT. Estou apenas tentando determinar a natureza de um problema para solucionar o problema.
nullnão faz sentido.
Levando em conta tudo dito, eis o código que eu uso para detectar se o dispositivo possui o Froyo ou o sistema operacional Android mais recente (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;
}
Obviamente, você pode modificar essa condição se levar em conta as versões 1.0 e 1.5 do Android, caso precise de um verificador genérico. Você provavelmente terminará com algo assim:
// 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;
}
}
Deixe-me saber se o código não está funcionando para você.
tente isto:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
// only for gingerbread and newer versions
}
Entendi. Está usando o getApplicationInfo()método da Contextclasse.
SDK.INT é suportado para Android 1.6 e superior
SDK é suportado para todas as versões
Então eu faço:
String sdk_version_number = android.os.Build.VERSION.SDK;
Créditos para: CommonsWare sobre esta resposta
Eu prefiro ter a versão como número a ser manipulada de maneira mais fácil do que escrevi:
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();
}
Sua codificação feliz de trabalho
String versionRelease = BuildConfig.VERSION_NAME;
versionRelease :- 2.1.17
Nota Verifique se o seu pacote de importação está correto (importe o nome do pacote do aplicativo, caso contrário, não funcionará corretamente)
Melhorei o código que usei
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;
}