Recuperando la versión de la API de Android mediante programación

Respuestas:

1068

Como se describe en la documentación de Android, el nivel de SDK (entero) que ejecuta el teléfono está disponible en:

android.os.Build.VERSION.SDK_INT

La clase correspondiente a este int está en la android.os.Build.VERSION_CODESclase.

Ejemplo 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
}

Editar : Este SDK_INT está disponible desde Donut (Android 1.6 / API4), así que asegúrese de que su aplicación no sea retrocompatible con Cupcake (Android 1.5 / API3) cuando la use o su aplicación se bloqueará (gracias al Programador Bruce por la precisión) .

La documentación de Android correspondiente está aquí y aquí

ol_v_er
fuente
18
Si el código se ejecuta en 1.5, entonces hacer referencia a SDK_INT arrojará una excepción, ya que se introdujo con API 4. (Sí, puede ejecutar un APK compilado con código API 4 en 1.5. Y sí, cuando se alcanza ese código API 4 , arroja una excepción.)
Programador Bruce
@ProgrammerBruce ¿cómo prevenir el bloqueo? ¿O cómo no ser retrocompatible?
Cœur
1
@ Cœur Creo que construir una aplicación retro compatible con Android 1.5 no es realmente útil hoy en día. Simplemente configure su proyecto minSdkVersionen 4(Android 1.6) y continúe.
ol_v_er
¿Por qué no utilizar String android.os.Build.VERSION.SDK en su lugar? Funciona para todas las versiones de Android
PYK
@PYK Este atributo android.os.Build.VERSION.SDK está en desuso, por lo que no debe usarse. developer.android.com/reference/android/os/…
ol_v_er
146

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

Salida:

E/MyActivity:   manufacturer ManufacturerX
                model SM-T310 
                version 19 
                versionRelease 4.4.2
CommonSenseCode
fuente
2
Build.VERSION.RELEASE es lo que estaba buscando. Gracias @CommonSenseCode
axierjhtjz
81
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 ¡Build.VERSION.RELEASE funcionará sin importar el uso de la versión estándar de Android o no!

Para usarlo, podrías hacer esto;

String androidOS = Build.VERSION.RELEASE;
Falcon165o
fuente
99
De acuerdo con los documentos int android.os.Build.VERSION.SDK_INTy public static final int SDK_INTy Added in API level 4¿cómo podría regresar int (no Integer) NULL? NULLes un estado para un objeto, por lo que su Build o VERSION podría ser nullteóricamente, pero en tal caso no solo SDK_INTsino RELEASEque también causará un NPE. SDK_INT probablemente podría causar "No hay tal excepción de método" o algo así pero no nulo o NPE. Si solo la ROM personalizada rompe los documentos y el método declarado como public static final Integer SDK_INT. Solo estoy tratando de determinar la naturaleza de un problema para hacer una solución.
Stan
3
¿Alguien puede verificar si este es realmente el caso? El comentario de Stan deja bastante claro que nulo no es posible. ¿Y los ROM / OS personalizados de Android seguramente tienen que originarse en alguna versión de compilación? Entonces, ¿Build.VERSION.SDK_INT debería reflejar esto?
BT
3
He rechazado esto porque el reclamo no está respaldado y la advertencia nullno tiene sentido.
Sam
El teléfono rooteado o las rom personalizadas nunca deben tocar este número. Sin embargo, generalmente cambian la Build.VERSION.RELEASE.
Phuah Yee Keat
Hay muchos problemas conocidos cuando se trata de OS / Roms personalizados. La versión que tenía en mi Android anterior en ese momento (quiero decir GS3) tenía ese problema. Ha habido muchos problemas con los valores codificados o valores que no solo eran correctos. Ejemplo difícil, las direcciones de Wi-Fi Mac están codificadas.
Falcon165o
31

Teniendo en cuenta todo lo dicho, aquí está el código que uso para detectar si el dispositivo tiene Froyo o un sistema operativo Android más reciente (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, puede modificar eso si es necesario para tener en cuenta las versiones 1.0 y 1.5 de Android en caso de que necesite un verificador genérico. Probablemente terminarás con algo como esto:

// 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;
    }
}

Avísame si el código no te funciona.

nikib3ro
fuente
29

prueba esto:

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

android.os.Build.VERSION.SDK debería darle el valor del Nivel API. Puede encontrar fácilmente el mapeo desde el nivel de API a la versión de Android en la documentación de Android. Creo que 8 es para 2.2, 7 para 2.1, y así sucesivamente.

jvdneste
fuente
Este método está en desuso.
Adi
4

Entendido. Está usando el getApplicationInfo()método de la Contextclase.

Parth Mehta
fuente
1
Esto le proporcionará minSdkVersion y targetSdkVersion del APK, que describe qué versiones de API admite la aplicación. Esta no es la versión API del teléfono en el que se ejecuta actualmente la aplicación.
OldSchool4664
2

SDK.INT es compatible con Android 1.6 y superior

SDK es compatible con todas las versiones

Así que hago:

String sdk_version_number = android.os.Build.VERSION.SDK;

Créditos a: CommonsWare sobre esta respuesta

PYK
fuente
SDK en desuso en Java.
limonik
0

Prefiero tener la versión como número para ser manejada más fácilmente que escribí esto:

  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
fuente
0

Está funcionando feliz codificación

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

Nota Asegúrese de que su paquete de importación sea correcto (importe el paquete, el nombre del paquete de la aplicación; de lo contrario, no funcionará correctamente)

Keshav Gera
fuente
-2

Mejoré el código que usé

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
fuente