Récupération de la version d'API Android par programmation

581

Existe-t-il un moyen d'obtenir la version d'API que le téléphone exécute actuellement?

Parth Mehta
la source
62
@SteveHaley Nous considérons généralement que quelque chose qui vient en premier n'est pas un doublon de quelque chose qui apparaît plus tard.
rds

Réponses:

1068

Comme décrit dans la documentation Android, le niveau SDK (entier) que le téléphone exécute est disponible dans:

android.os.Build.VERSION.SDK_INT

La classe correspondant à cet int est dans la android.os.Build.VERSION_CODESclasse.

Exemple de code:

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 : ce SDK_INT est disponible depuis Donut (android 1.6 / API4) alors assurez-vous que votre application n'est pas rétro-compatible avec Cupcake (android 1.5 / API3) lorsque vous l'utilisez ou votre application plantera (merci au programmeur Bruce pour la précision) .

La documentation Android correspondante est ici et ici

ol_v_er
la source
18
Si le code s'exécute sur 1.5, le référencement de SDK_INT lèvera une exception, car il a été introduit avec l'API 4. (Oui, vous pouvez exécuter un APK compilé avec le code API 4 sur 1.5. Et oui, lorsque ce code API 4 est atteint , cela lève une exception.)
Programmeur Bruce
@ProgrammerBruce comment éviter le crash? Ou comment ne pas être rétro-compatible?
Cœur
1
@ Cœur Je pense que construire une application rétro compatible avec Android 1.5 n'est pas vraiment utile de nos jours. Réglez simplement votre projet minSdkVersionsur 4(Android 1.6) et continuez.
ol_v_er
Pourquoi ne pas utiliser à la place la chaîne android.os.Build.VERSION.SDK ? Cela fonctionne pour toutes les versions d'Android
PYK
@PYK Cet attribut android.os.Build.VERSION.SDK est obsolète, il ne doit donc pas être utilisé. developer.android.com/reference/android/os/…
ol_v_er
146

Très facile:

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

Production:

E/MyActivity:   manufacturer ManufacturerX
                model SM-T310 
                version 19 
                versionRelease 4.4.2
CommonSenseCode
la source
2
Build.VERSION.RELEASE est ce que je cherchais. Merci @CommonSenseCode
axierjhtjz
81
Build.VERSION.RELEASE;

Cela vous donnera les numéros réels de votre version; alias 2.3.3 ou 2.2. Le problème avec l'utilisation de Build.VERSION.SDK_INT est que si vous avez un téléphone enraciné ou une rom personnalisée, vous pouvez avoir un système d'exploitation non standard (alias mon Android exécute 2.3.5) et qui renverra un null lors de l'utilisation de Build.VERSION.SDK_INT donc Build.VERSION.RELEASE fonctionnera, peu importe que vous utilisiez la version Android standard ou non!

Pour l'utiliser, vous pouvez simplement le faire;

String androidOS = Build.VERSION.RELEASE;
Falcon165o
la source
9
Selon les documents int android.os.Build.VERSION.SDK_INTet public static final int SDK_INTet Added in API level 4comment int (et non Integer) pourrait-il revenir NULL? NULLest un état pour un objet, donc sa construction ou sa VERSION pourrait être nullthéoriquement, mais dans ce cas non seulement, SDK_INTmais RELEASEaussi provoquerait un NPE. SDK_INT pourrait probablement provoquer «aucune exception de méthode de ce type» ou quelque chose comme ça, mais pas null ou NPE. Si seulement la ROM personnalisée rompt les documents et la méthode déclarée comme public static final Integer SDK_INT. J'essaie simplement de déterminer la nature d'un problème pour contourner ce problème.
Stan
3
Quelqu'un peut-il vérifier si tel est bien le cas? Le commentaire de Stan montre assez clairement que null n'est pas possible. Et les ROM / OS Android personnalisés doivent sûrement provenir d'une version de la version? Alors, sûrement, Build.VERSION.SDK_INT devrait refléter cela?
BT
3
J'ai rétrogradé cela car la revendication n'est pas vraiment sauvegardée et l'avertissement nulln'a pas de sens.
Sam
Le téléphone enraciné ou les roms personnalisés ne doivent jamais toucher ce numéro. Cependant, ils modifient généralement le Build.VERSION.RELEASE.
Phuah Yee Keat
Il y a beaucoup de problèmes connus en ce qui concerne les OS / Roms personnalisés. La version que j'avais sur mon ancien Android à l'époque (je veux dire GS3) avait ce problème. Il y a eu beaucoup de problèmes avec les valeurs codées en dur ou les valeurs n'étaient pas simplement correctes. Exemple concret, les adresses Wi-Fi Mac sont codées en dur.
Falcon165o
31

Compte tenu de tout cela, voici le code que j'utilise pour détecter si l'appareil a Froyo ou un système d'exploitation Android plus récent (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;
}

De toute évidence, vous pouvez modifier cette condition pour prendre en compte les versions 1.0 et 1.5 d'Android au cas où vous auriez besoin d'un vérificateur générique. Vous vous retrouverez probablement avec quelque chose comme ceci:

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

Faites-moi savoir si le code ne fonctionne pas pour vous.

nikib3ro
la source
29

essaye ça:

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

android.os.Build.VERSION.SDK devrait vous donner la valeur du niveau API. Vous pouvez facilement trouver le mappage du niveau api à la version Android dans la documentation Android. Je pense que 8 correspond à 2.2, 7 à 2.1, etc.

jvdneste
la source
Cette méthode est obsolète.
Adi
4

Je l'ai. Son utilisant la getApplicationInfo()méthode de la Contextclasse.

Parth Mehta
la source
1
Cela vous donnera la version minSdk et la version targetSdkVersion de l'APK, qui décrit les versions d'API prises en charge par l'application. Ce n'est pas la version API du téléphone sur lequel l'application est actuellement exécutée.
OldSchool4664
2

SDK.INT est pris en charge pour Android 1.6 ou version ultérieure

Le SDK est pris en charge pour toutes les versions

Moi aussi:

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

Crédits à: CommonsWare sur cette réponse

PYK
la source
SDK déconseillé en Java.
limonik
0

Je préfère que la version en tant que numéro soit plus facile à manipuler que ce que j'ai écrit:

  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
la source
0

Son travail Happy Coding

String versionRelease = BuildConfig.VERSION_NAME;

versionRelease :- 2.1.17

Remarque Veuillez vous assurer que votre package d'importation est correct (importez le package du nom de votre package d'application sinon il ne fonctionnera pas correctement)

Keshav Gera
la source
-2

J'ai amélioré le code que j'ai utilisé

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
la source