¿Cómo puedo verificar la versión del sistema de Android?

494

¿Alguien sabe cómo puedo verificar la versión del sistema (p 1.0. Ej . 2.2, Etc.) mediante programación?

davs
fuente
¿hay acceso directo (fragmento de código o plantilla en vivo) para agregar esta comprobación en el estudio de Android
Basheer AL-MOMANI

Respuestas:

420

Compruebe android.os.Build.VERSION.

  • CODENAME: El nombre en código de desarrollo actual o la cadena "REL" si se trata de una versión de lanzamiento.
  • INCREMENTAL: El valor interno utilizado por el control de origen subyacente para representar esta compilación.
  • RELEASE: La cadena de versión visible para el usuario.
Estanque Robby
fuente
72
¿Algún ejemplo sobre cómo usarlo?
Jonathan
1
La parte difícil de esto es que SDK_INT se ha definido en el Nivel 4 de API y su uso falla en 1-3. ¿Alguien sabe cómo lidiar con eso?
Zordid
SDK está disponible desde API 1, también INCREMENTAL está disponible para todas las versiones.
nuala
1
Build.VERSION.RELEASE es una cadena, por lo tanto, puede usar esta cadena como desee.
paiego
8
No se preocupe, ni siquiera los hombres de las cavernas están usando las API de Android 1-3 hoy. @Zordid
Josh
811

Ejemplo de cómo usarlo:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only for gingerbread and newer versions
}
Átomo
fuente
24
Ignoro totalmente cualquier versión anterior a Eclair (7), Android 2.1 y muy pronto también dejamos de admitir el 2.1. Pero puede usar el SDK en lugar de SDK_INT.
Atom
12
El SDK estaba dependiente en el nivel 4 de la API. Utilice SDK_INT en su lugar.
erdomester
Tengo una pregunta: si se está ejecutando en un sistema anterior a GINGERBREAD, entonces no podemos obtener android.os.Build.VERSION_CODES.GINGERBREAD, ¿se bloqueará la aplicación?
HongchaoZhang
No, porque GINGERBREAD será reemplazado solo por el número durante la compilación de Java. Solo es necesario usar una versión de compilación más grande de Android.
ATom
97

Build.Version es el lugar al que acudir para obtener estos datos. Aquí hay un fragmento de código sobre cómo formatearlo.

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

Se parece a esto "SDK de Android: 19 (4.4.4)"

jpotts18
fuente
63
Build.VERSION.RELEASE;

Eso le dará los números reales de su versión; aka 2.3.3 o 2.2. El problema con el uso de Build.VERSION.SDK_INT es que si tiene un teléfono rooteado o una rom personalizada, podría tener un sistema operativo no estándar (también conocido como mi Android ejecuta 2.3.5) y eso devolverá un valor nulo cuando use Build.VERSION.SDK_INT ¡Así que Build.VERSION.RELEASE funcionará sin importar qué!

Falcon165o
fuente
Desde SDK: "La cadena de versión visible para el usuario. Por ejemplo," 1.0 "o" 3.4b5 "." .... "3.4b5" ¿cómo puedo determinar qué número de versión es?
davs
La respuesta completa 2.3.3 es el número de versión, o 2.2, o 2.3.5 (rom personalizado en mi caso). Ese es el número de versión del sistema operativo en su conjunto.
Falcon165o
Devuelve lo mismo Menú >> Configuración >> Acerca del teléfono. Debe etiquetarse como Versión de firmware o algo que afecte.
Falcon165o
58
¿Cómo demonios podría un int devolver un nulo? SDK_INT es un int primitivo.
Zsolt Safrany
57

Para verificar la versión del dispositivo que es mayor o igual que Marshmallow, use este código.

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

    }

para chequear a otros simplemente cambie los VERSION_CODES como,
K para kitkat,
L para loolipop N para Turrón y así sucesivamente ...

paulcab
fuente
48

Puedes encontrar la versión de Android mirando Build.VERSION .

La documentación recomienda que compruebe Build.VERSION.SDK_INTlos valores enBuild.VERSION_CODES .

Esto está bien siempre y cuando se dé cuenta de que Build.VERSION.SDK_INTsolo se introdujo en API Nivel 4, es decir, Android 1.6 (Donut). Por lo tanto, esto no le afectará, pero si desea que su aplicación se ejecute en Android 1.5 o anterior, entonces debería usar la obsoleta Build.VERSION.SDK.

Dave Webb
fuente
30

No puedo comentar las respuestas, pero hay un gran error en la respuesta de Kaushik: SDK_INT no es lo mismo que la versión del sistema, pero en realidad se refiere al Nivel API.

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

El valor Build.VERSION_CODES.ICE_CREAM_SANDWICHes igual a 14. 14 es el nivel API de Ice Cream Sandwich, mientras que la versión del sistema es 4.0. Entonces, si escribe 4.0, su código se ejecutará en todos los dispositivos a partir de Donut, porque 4 es el nivel API de Donut ( Build.VERSION_CODES.DONUTes igual a 4).

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

Este ejemplo es una razón por la cual usar 'número mágico' es un mal hábito.

Michał Kisiel
fuente
77
En realidad, Build.VERSION.SDK_INT es el nivel de API, no el código de versión. Entonces, la línea correcta seríaif(Build.VERSION.SDK_INT >= 15){
erdomester
¿Qué sucede si le digo que el código de versión es el mismo que el nivel de API y el SDK_INT de ICE_CREAM_SANDWICH es 14 y no 15? @erdomester
Beyondo
19

Por ejemplo, una característica solo funciona para api21 arriba, lo siguiente arreglamos errores en api21 abajo

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

Tenga en cuenta que Build.VERSION.SDK_INT no es confiable, es mencionado por @ Falcon165o y recientemente me encontré con ese también.

Entonces, para obtener los datos de String (basados ​​en la lista de versiones de Android ) de Android actualmente instalado, hice un 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
}

Ejemplo de una salida que produce:

Marshmallow v6.0, Nivel API: 23

Nikita Kurtin
fuente
1
Este código se bloquea en Double.parseDouble (Build.VERSION.RELEASE) cuando la versión contiene más de un punto. Por ejemplo 7.1.1
Miklós Keresztes
@ MiklósKeresztes Gracias por su comentario informativo. He arreglado mi respuesta.
Nikita Kurtin
7
if (Build.VERSION.SDK_INT >= ApiHelper.VERSION_CODES.HONEYCOMB_MR2) {
//do anything you  like.
}
Kunkun Liu
fuente
¿Podría por favor elaborar más su respuesta agregando un poco más de descripción sobre la solución que proporciona?
abarisone
3

usa esta clase

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
fuente
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
fuente
¿Cómo ayudará esto?
samuel owino
1

Dado que tiene bashen su dispositivo Android, puede usar esta función 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
fuente