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_CODES
classe
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) .
minSdkVersion
para 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_INT
e public static final int SDK_INT
e Added in API level 4
como poderia int (não Integer) retorno NULL
? NULL
é um estado para um objeto, portanto sua Build ou VERSION pode ser null
teoricamente, mas nesse caso, não apenas SDK_INT
mas RELEASE
també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.
null
nã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 Context
classe.
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;
}