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


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


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

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;

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.


29

essaye ça:

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

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.


Cette méthode est obsolète.
Adi

4

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


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


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

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)


-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;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.