Comment puis-je vérifier la version système d'Android?

494

Est -ce que quelqu'un sait comment puis - je vérifier la version du système (par exemple 1.0, 2.2etc.) programatically?

davs
la source
existe-t-il un raccourci (extrait de code ou modèle en direct) pour ajouter cette vérification dans le studio Android
Basheer AL-MOMANI

Réponses:

420

Vérifiez android.os.Build.VERSION.

  • CODENAME: Le nom de code de développement actuel, ou la chaîne "REL" s'il s'agit d'une version.
  • INCREMENTAL: Valeur interne utilisée par le contrôle de source sous-jacent pour représenter cette génération.
  • RELEASE: La chaîne de version visible par l'utilisateur.
Robby Pond
la source
72
des exemples sur la façon de l'utiliser?
Jonathan
1
La partie difficile à ce sujet est que SDK_INT a été défini dans l'API niveau 4 et son utilisation échoue sur 1-3. Est-ce que quelqu'un sait comment bien gérer cela?
Zordid
Le SDK est disponible depuis l'API 1, INCREMENTAL est également disponible pour toutes les versions.
nuala
1
Build.VERSION.RELEASE est une chaîne, vous pouvez donc utiliser cette chaîne comme vous le souhaitez.
paiego
8
Ne vous inquiétez pas, même les hommes des cavernes n'utilisent pas aujourd'hui les API Android 1-3. @Zordid
Josh
811

Exemple d'utilisation:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) {
     // only for gingerbread and newer versions
}
Atome
la source
24
J'ignore totalement toute version plus ancienne qu'Eclair (7), Android 2.1 et très bientôt nous arrêtons également le support pour le 2.1. Mais vous pouvez utiliser le SDK au lieu de SDK_INT.
ATom
12
Le SDK a été déprécié au niveau de l'API 4. Utilisez plutôt SDK_INT.
erdomester
J'ai une question: s'il fonctionne sur un système plus ancien que GINGERBREAD, alors nous ne pouvons pas obtenir android.os.Build.VERSION_CODES.GINGERBREAD, l'application se bloquera-t-elle?
HongchaoZhang
Non, car GINGERBREAD sera remplacé par le seul numéro lors de la génération java. Il est seulement nécessaire d'utiliser une version de compilation plus grande d'Android.
ATom
97

Build.Version est l'endroit où aller pour ces données. Voici un extrait de code pour savoir comment le formater.

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

Il ressemble à ceci "SDK Android: 19 (4.4.4)"

jpotts18
la source
63
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 quoi qu'il arrive!

Falcon165o
la source
Du SDK: "La chaîne de version visible par l'utilisateur. Par exemple," 1.0 "ou" 3.4b5 "." .... "3.4b5" comment puis-je déterminer de quel numéro de version s'agit-il?
davs
La réponse complète 2.3.3 est le numéro de version, ou 2.2, ou 2.3.5 (rom personnalisé dans mon cas). C'est le numéro de version du système d'exploitation dans son ensemble.
Falcon165o
Cela renvoie la même chose Menu >> Paramètres >> À propos du téléphone. Il doit être étiqueté Version du micrologiciel ou quelque chose à cet effet.
Falcon165o
58
Comment diable un int pouvait-il retourner un nul? SDK_INT est un int primitif.
Zsolt Safrany
57

Pour vérifier la version de l'appareil qui est supérieure ou égale à Marshmallow, utilisez ce code.

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

    }

pour vérifier les autres, il suffit de changer les VERSION_CODES comme,
K pour kitkat,
L pour loolipop N pour Nougat et ainsi de suite ...

paulcab
la source
48

Vous pouvez trouver la version Android en regardant Build.VERSION.

La documentation vous recommande de vérifier Build.VERSION.SDK_INTles valeurs dans Build.VERSION_CODES.

C'est bien tant que vous vous rendez compte que cela Build.VERSION.SDK_INTn'a été introduit que dans l'API niveau 4, c'est-à-dire Android 1.6 (Donut). Donc, cela ne vous affectera pas, mais si vous vouliez que votre application s'exécute sur Android 1.5 ou une version antérieure, vous devriez utiliser la version obsolète à la Build.VERSION.SDKplace.

Dave Webb
la source
30

Je ne peux pas commenter les réponses, mais il y a une énorme erreur dans la réponse de Kaushik: SDK_INT n'est pas la même que la version système mais fait en fait référence au niveau API.

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

La valeur Build.VERSION_CODES.ICE_CREAM_SANDWICHest égale à 14. 14 est le niveau API de Ice Cream Sandwich, tandis que la version système est 4.0. Donc, si vous écrivez 4.0, votre code sera exécuté sur tous les appareils à partir de Donut, car 4 est le niveau API de Donut ( Build.VERSION_CODES.DONUTégal à 4).

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

Cet exemple est une raison pour laquelle l'utilisation du «nombre magique» est une mauvaise habitude.

Michał Kisiel
la source
7
En fait, Build.VERSION.SDK_INT est le niveau API, pas le code de version. Donc, la ligne appropriée seraitif(Build.VERSION.SDK_INT >= 15){
erdomester
Que se passe-t-il si je vous dis que le code de version est le même que le niveau API et que le SDK_INT de ICE_CREAM_SANDWICH est 14 et non 15? @erdomester
Beyondo
19

Par exemple, une fonctionnalité ne fonctionne que pour api21 up, ce qui suit, nous corrigeons les bugs dans api21 down

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

Sachez que Build.VERSION.SDK_INT n'est pas fiable, il est mentionné par @ Falcon165o et récemment j'ai rencontré celui-là aussi.

Donc, pour obtenir les données String (basées sur la liste des versions Android ) d'Android actuellement installé, j'ai créé un code comme celui-ci:

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
}

Exemple de sortie qu'il produit:

Marshmallow v6.0, niveau API: 23

Nikita Kurtin
la source
1
Ce code se bloque sur Double.parseDouble (Build.VERSION.RELEASE) lorsque la version contient plusieurs points. Par exemple 7.1.1
Miklós Keresztes
@ MiklósKeresztes Merci pour votre commentaire informatif - j'ai corrigé ma réponse.
Nikita Kurtin
7
if (Build.VERSION.SDK_INT >= ApiHelper.VERSION_CODES.HONEYCOMB_MR2) {
//do anything you  like.
}
Kunkun Liu
la source
Pourriez-vous élaborer davantage votre réponse en ajoutant un peu plus de description sur la solution que vous proposez?
abarisone
3

utiliser cette 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
la source
3

Utilisez cette méthode:

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

        try {
             versionName = String.valueOf(Build.VERSION.RELEASE);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return versionName;
    }
Manoj Tarkar
la source
Comment cela vous aidera-t-il?
samuel owino
1

Étant donné que vous avez bashsur votre appareil Android, vous pouvez utiliser cette fonction 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
la source