Recuperando a versão da API do Android programaticamente

581

Existe alguma maneira de obter a versão da API que o telefone está executando no momento?

Parth Mehta
fonte
62
@SteveHaley Geralmente, consideramos que algo que vem primeiro não é uma duplicata de algo que aparece mais tarde.
rds
5
possível duplicata de Como recuperar a versão do Android SDK?
TAOCP

Respostas:

1067

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

A documentação android correspondente está aqui e aqui

ol_v_er
fonte
18
Se o código estiver em execução na 1.5, a referência ao SDK_INT lançará uma exceção, pois foi introduzida na API 4. (Sim, você pode executar um APK compilado com o código da API 4 na 1.5. E sim, quando esse código da API 4 for atingido , ele faz lançar uma exceção).
programador Bruce
@ProgrammerBruce como evitar o acidente? Ou como não ser retro-compatível?
precisa
1
@ Cœur Acho que a construção de um aplicativo retro compatível com o Android 1.5 não é realmente útil hoje em dia. Basta definir seu projeto minSdkVersionpara 4(Android 1.6) e continuar.
ol_v_er
Por que não usar a String android.os.Build.VERSION.SDK ? Funciona para todas as versões do Android
PYK
@PYK Este atributo android.os.Build.VERSION.SDK foi descontinuado e, portanto, não deve ser usado. developer.android.com/reference/android/os/…
ol_v_er 12/11/19
146

Muito fácil:

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

Resultado:

E/MyActivity:   manufacturer ManufacturerX
                model SM-T310 
                version 19 
                versionRelease 4.4.2
CommonSenseCode
fonte
2
Build.VERSION.RELEASE é o que eu estava procurando. Obrigado @CommonSenseCode
axierjhtjz 20/03/19
81
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;
Falcon165o
fonte
9
De acordo com documentos 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.
5153 Stan
3
Alguém pode verificar se esse é realmente o caso? O comentário de Stan deixa bem claro que nulo não é possível. E os ROMs / SOs personalizados do Android certamente têm que se originar de alguma versão da versão? Então, com certeza, o Build.VERSION.SDK_INT deve refletir isso?
BT
3
Eu diminuí a votação porque a reivindicação não é realmente copiada e o aviso nullnão faz sentido.
25414 Sam
As chamadas telefônicas enraizadas ou personalizadas nunca devem tocar nesse número. Eles geralmente alteram o Build.VERSION.RELEASE.
Phuah Yee Keat
Existem muitos problemas conhecidos quando se trata de SO / ROM personalizados. A versão que eu tinha no meu Android mais antigo na época (quero dizer GS3) tinha esse problema. Houve muitos problemas com valores codificados ou não estavam corretos. Por exemplo, endereços Wi-Fi para Mac sendo codificados.
Falcon165o
31

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ê.

nikib3ro
fonte
29

tente isto:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only for gingerbread and newer versions
 }
Khalid Taha
fonte
9

android.os.Build.VERSION.SDK deve fornecer o valor do nível da API. Você pode encontrar facilmente o mapeamento do nível da API para a versão do Android na documentação do Android. Eu acredito que 8 é para 2.2, 7 para 2.1, e assim por diante.

jvdneste
fonte
Este método está obsoleto.
Adi
4

Entendi. Está usando o getApplicationInfo()método da Contextclasse.

Parth Mehta
fonte
1
Isso fornecerá a você minSdkVersion e targetSdkVersion do APK, que descreve quais versões da API o aplicativo suporta. Esta não é a versão da API do telefone em que o aplicativo está sendo executado.
precisa
2

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

PYK
fonte
SDK descontinuado em Java.
limonik 26/03
0

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();
}
alex
fonte
0

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)

Keshav Gera
fonte
-2

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;
}
alex
fonte