Como posso verificar a versão do sistema do Android?

494

Alguém sabe como posso verificar a versão do sistema (por exemplo 1.0, 2.2, etc.) através de programação?

davs
fonte
Existe atalho (trecho de código ou modelo vivo) para adicionar essa verificação no estúdio android
Basheer AL-Momani

Respostas:

420

Verifique android.os.Build.VERSION.

  • CODENAME: O nome do código de desenvolvimento atual ou a string "REL" se for uma versão compilada.
  • INCREMENTAL: O valor interno usado pelo controle de origem subjacente para representar essa compilação.
  • RELEASE: A string da versão visível ao usuário.
Robby Pond
fonte
72
alguns exemplos de como usá-lo?
6117 Jonathan
1
A parte mais difícil disso é que o SDK_INT foi definido no nível 4 da API e o uso falha em 1-3. Alguém sabe como lidar bem com isso?
Zordid 23/03
O SDK está disponível desde a API 1, também INCREMENTAL está disponível para todas as versões.
Nuala
1
Build.VERSION.RELEASE é uma String, portanto, você pode usá-la como desejar.
paiego 10/09/12
8
Não se preocupe, nem homens das cavernas estão usando as APIs do Android 1-3 hoje. @Zordid
Josh
811

Exemplo de como usá-lo:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only for gingerbread and newer versions
}
Átomo
fonte
24
Eu ignoro totalmente qualquer versão anterior à Eclair (7), Android 2.1 e muito em breve paramos o suporte para a 2.1 também. Mas você pode usar o SDK em vez do SDK_INT.
ATom 3/12/12
12
O SDK foi exibido no nível 4 da API. Use o SDK_INT.
erdomester
Tenho uma pergunta: se estiver sendo executado em um sistema mais antigo que GINGERBREAD, não será possível obter o android.os.Build.VERSION_CODES.GINGERBREAD, o aplicativo falhará?
HongchaoZhang
Não, porque GINGERBREAD será substituído apenas pelo número durante a compilação do java. Só é necessário usar uma versão maior de compilação do Android.
Atom
97

Build.Version é o local para esses dados. Aqui está um trecho de código de como formatá-lo.

public String getAndroidVersion() {
    String release = Build.VERSION.RELEASE;
    int sdkVersion = Build.VERSION.SDK_INT;
    return "Android SDK: " + sdkVersion + " (" + release +")";
}

É assim "Android SDK: 19 (4.4.4)"

jpotts18
fonte
63
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á, não importa o quê!

Falcon165o
fonte
No SDK: "A cadeia de caracteres da versão visível ao usuário. Por exemplo," 1.0 "ou" 3.4b5 "." .... "3.4b5" como posso determinar qual é o número da versão?
DAVs
Toda a resposta 2.3.3 é o número da versão ou 2.2 ou 2.3.5 (ROM personalizada no meu caso). Esse é o número da versão do sistema operacional como um todo.
precisa saber é o seguinte
Ele retorna a mesma coisa Menu >> Configurações >> Sobre o telefone. Ele deve ser rotulado como Versão do firmware ou algo assim.
precisa saber é o seguinte
58
Como diabos um int pode retornar um nulo? SDK_INT é um int primitivo.
Zsolt Safrany
57

Para verificar a versão do dispositivo que é maior ou igual a Marshmallow, use este código.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){

    }

para verificar os outros, basta alterar o VERSION_CODES como,
K para kitkat,
L para loolipop N para Nougat e assim por diante ...

paulcab
fonte
48

Você pode descobrir a versão do Android olhando Build.VERSION.

A documentação recomenda que você verifique Build.VERSION.SDK_INTos valores em Build.VERSION_CODES.

Isso é bom desde que você saiba que Build.VERSION.SDK_INTfoi introduzido apenas na API Nível 4, ou seja, Android 1.6 (Donut). Portanto, isso não afetará você, mas se você deseja que o aplicativo seja executado no Android 1.5 ou anterior, será necessário usar o obsoleto Build.VERSION.SDK.

Dave Webb
fonte
30

Não posso comentar as respostas, mas há um grande erro na resposta de Kaushik: SDK_INT não é o mesmo que a versão do sistema, mas na verdade se refere ao nível da API.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
    //this code will be executed on devices running ICS or later
}

O valor Build.VERSION_CODES.ICE_CREAM_SANDWICHé igual a 14. 14 é o nível da API do Ice Cream Sandwich, enquanto a versão do sistema é 4.0. Portanto, se você escrever 4.0, seu código será executado em todos os dispositivos a partir do Donut, porque 4 é o nível da API do Donut ( Build.VERSION_CODES.DONUTigual a 4).

if(Build.VERSION.SDK_INT >= 4.0){
    //this code will be executed on devices running on DONUT (NOT ICS) or later
}

Este exemplo é um motivo pelo qual usar 'número mágico' é um mau hábito.

Michał Kisiel
fonte
7
Na verdade, Build.VERSION.SDK_INT é o nível da API, não o código da versão. Portanto, a linha correta seriaif(Build.VERSION.SDK_INT >= 15){
erdomester 24/03
E se eu lhe disser que o código da versão é igual ao nível da API e o SDK_INT do ICE_CREAM_SANDWICH for 14, não 15? @erdomester
Beyondo
19

Por exemplo, um recurso funciona apenas para a api21, da seguinte forma, corrigimos bugs na api21 para baixo

    if(Build.VERSION.SDK_INT >= 21) {
    //only api 21 above
    }else{
   //only api 21 down
    }
HOSHYAR Ahmadpour
fonte
19

Esteja ciente de que o Build.VERSION.SDK_INT não é confiável, é mencionado pelo @ Falcon165o e recentemente encontrei esse também.

Então, para obter os dados da String (com base na lista de versões do Android ) do Android atualmente instalado, criei um código como este:

Java

//Current Android version data
public static String currentVersion(){
    double release=Double.parseDouble(Build.VERSION.RELEASE.replaceAll("(\\d+[.]\\d+)(.*)","$1"));
    String codeName="Unsupported";//below Jelly bean OR above Oreo
    if(release>=4.1 && release<4.4)codeName="Jelly Bean";
    else if(release<5)codeName="Kit Kat";
    else if(release<6)codeName="Lollipop";
    else if(release<7)codeName="Marshmallow";
    else if(release<8)codeName="Nougat";
    else if(release<9)codeName="Oreo";
    return codeName+" v"+release+", API Level: "+Build.VERSION.SDK_INT;
}

Kotlin

fun currentVersion(): String {
    val release = java.lang.Double.parseDouble(java.lang.String(Build.VERSION.RELEASE).replaceAll("(\\d+[.]\\d+)(.*)", "$1"))
    var codeName = "Unsupported"//below Jelly bean OR above Oreo
    if (release >= 4.1 && release < 4.4)  codeName = "Jelly Bean"
    else if (release < 5) codeName = "Kit Kat"
    else if (release < 6) codeName = "Lollipop"
    else if (release < 7) codeName = "Marshmallow"
    else if (release < 8) codeName = "Nougat"
    else if (release < 9) codeName = "Oreo"
    return codeName + " v" + release + ", API Level: " + Build.VERSION.SDK_INT
}

Exemplo de uma saída que ela produz:

Marshmallow v6.0, API nível: 23

Nikita Kurtin
fonte
1
Esse código falha no Double.parseDouble (Build.VERSION.RELEASE) quando a versão contém mais de um ponto. Por exemplo 7.1.1
Miklós Keresztes 04/10
@ MiklósKeresztes Obrigado pelo comentário informativo - Corrigi minha resposta.
Nikita Kurtin
7
if (Build.VERSION.SDK_INT >= ApiHelper.VERSION_CODES.HONEYCOMB_MR2) {
//do anything you  like.
}
Kunkun Liu
fonte
Você poderia elaborar mais sua resposta, adicionando um pouco mais de descrição sobre a solução que você fornece?
abarisone
3

use esta classe

import android.os.Build;

/**
 * Created by MOMANI on 2016/04/14.
 */
public class AndroidVersionUtil {
    public static int getApiVersion() {
        return android.os.Build.VERSION.SDK_INT;
    }

    public static boolean isApiVersionGraterOrEqual(int thisVersion) {
        return android.os.Build.VERSION.SDK_INT >= thisVersion;
    }
}
Basheer AL-MOMANI
fonte
3

Use este método:

 public static String getAndroidVersion() {
        String versionName = "";

        try {
             versionName = String.valueOf(Build.VERSION.RELEASE);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return versionName;
    }
Manoj Tarkar
fonte
Como isso vai ajudar?
samuel Owino
1

Dado que você tem bashno seu dispositivo Android, você pode usar esta função bash:

function androidCodeName {
    androidRelease=$(getprop ro.build.version.release)
    androidCodeName=$(getprop ro.build.version.codename)

    # Time "androidRelease" x10 to test it as an integer
    case $androidRelease in
        [0-9].[0-9]|[0-9].[0-9].|[0-9].[0-9].[0-9])  androidRelease=$(echo $androidRelease | cut -d. -f1-2 | tr -d .);;
        [0-9].) androidRelease=$(echo $androidRelease | sed 's/\./0/');;
        [0-9]) androidRelease+="0";;
    esac

    [ -n "$androidRelease" ] && [ $androidCodeName = REL ] && {
    # Do not use "androidCodeName" when it equals to "REL" but infer it from "androidRelease"
        androidCodeName=""
        case $androidRelease in
        10) androidCodeName+=NoCodename;;
        11) androidCodeName+="Petit Four";;
        15) androidCodeName+=Cupcake;;
        20|21) androidCodeName+=Eclair;;
        22) androidCodeName+=FroYo;;
        23) androidCodeName+=Gingerbread;;
        30|31|32) androidCodeName+=Honeycomb;;
        40) androidCodeName+="Ice Cream Sandwich";;
        41|42|43) androidCodeName+="Jelly Bean";;
        44) androidCodeName+=KitKat;;
        50|51) androidCodeName+=Lollipop;;
        60) androidCodeName+=Marshmallow;;
        70|71) androidCodeName+=Nougat;;
        80|81) androidCodeName+=Oreo;;
        90) androidCodeName+=Pie;;
        100) androidCodeName+=ToBeReleased;;
        *) androidCodeName=unknown;;
        esac
    }
    echo $androidCodeName
}
SebMa
fonte