web-dev-qa-db-fra.com

Comment trouver le nom de la version Android par programme?

J'écris du code pour trouver la version Android comme celle-ci

String version=Build.VERSION.RELEASE;

en utilisant ce code, je reçois le numéro de version mais je veux le nom de version . comment obtenir le nom de version?

20
Venkat

Comme suggéré précédemment, la réflexion semble être la clé de cette question. StringBuilder et le formatage supplémentaire ne sont pas requis, ils ont été ajoutés uniquement pour illustrer l'utilisation.

import Java.lang.reflect.Field;
...

StringBuilder builder = new StringBuilder();
builder.append("Android : ").append(Build.VERSION.RELEASE);

Field[] fields = Build.VERSION_CODES.class.getFields();
for (Field field : fields) {
    String fieldName = field.getName();
    int fieldValue = -1;

    try {
        fieldValue = field.getInt(new Object());
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }

    if (fieldValue == Build.VERSION.SDK_INT) {
        builder.append(" : ").append(fieldName).append(" : ");
        builder.append("sdk=").append(fieldValue);
    }
}

Log.d(LOG_TAG, "OS: " + builder.toString());

Sur mon émulateur 4.1, j'obtiens cette sortie:

D/MainActivity( 1551): OS: Android : 4.1.1 : JELLY_BEAN : sdk=16

Prendre plaisir!

50
Kevin Grant

Code optimisé, cela fonctionnera:

import Java.lang.reflect.Field;

Field[] fields = Build.VERSION_CODES.class.getFields();
String osName = fields[Build.VERSION.SDK_INT + 1].getName();
Log.d("Android OsName:",osName);
12
Shyam Kumar

http://developer.Android.com/reference/Android/os/Build.VERSION_CODES.html contient des champs portant le nom que vous recherchez . Vous pouvez donc utiliser la réflexion pour trouver le champ correspondant. à la valeur "version".

Pourquoi voulez-vous le nom?

5

Vous obtiendrez les informations de ces

Android.os.Build.VERSION_CODES 

Android.os.Build.VERSION.SDK_INT

Plus d'informations peuvent être obtenues à partir de ce lien:

Récupération de la version de l'API Android par programme

J'espère que ceci vous aidera.

3
UVM

Regarde ça:

// Names taken from Android.os.build.VERSION_CODES
String[] mapper = new String[] {
    "Android BASE", "Android BASE 1.1", "CUPCAKE", "DONUT",
    "Eclair", "Eclair_0_1", "Eclair_MR1", "FROYO", "Gingerbread",
    "Gingerbread_MR1", "HONEYCOMB", "HONEYCOMB_MR1", "HONEYCOMB_MR2",
    "ICE_CREAM_SANDWICH", "ICE_CREAM_SANDWICH_MR1", "JELLY_BEAN"
};
int index = Build.VERSION.SDK_INT - 1;
String versionName = index < mapper.length? mapper[index] : "UNKNOWN_VERSION"; // > JELLY_BEAN)

Sachez que cette solution ne fonctionnera que dans la mesure où les codes de version continuent à être incrémentés, et vous devrez mettre à jour la liste avec chaque nouvelle version Android (si l'exactitude est importante).

3
Nacho Coloma

Comme décrit dans la documentation Android, le niveau de SDK (entier) utilisé par le téléphone est disponible dans:

Android.os.Build.VERSION.SDK_INT;

L'énumération correspondant à cet int est dans la classe Android.os.Build.VERSION_CODES.

Exemple de code:

int currentapiVersion = Android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= Android.os.Build.VERSION_CODES.FROYO){
    // Do something for froyo and above versions
} else{
    // do something for phones running an SDK before froyo
}

Edit: Ce SDK_INT est disponible depuis Donut (Android 1.6/API4). Assurez-vous donc que votre application n'est pas rétro-compatible avec Cupcake (Android 1.5/API3) lorsque vous l'utilisez ou votre application se plantera (grâce au programmeur Bruce pour la précision) .

1
hitesh141

Cette réponse fournit de meilleurs noms (complets) pour Marshmallow, tout en préservant l’avenir si vous ne mettez pas à jour votre application lorsqu’une nouvelle version paraît (le meilleur des deux mondes.) La liste des noms de version provient de ici .

String versionName =
        Build.VERSION_CODES.class.getFields()[Build.VERSION.SDK_INT + 1].getName();
String[] versionNames = new String[]{
        "Android BASE", "Android BASE 1.1", "CUPCAKE", "DONUT",
        "Eclair", "Eclair_0_1", "Eclair_MR1", "FROYO", "Gingerbread",
        "Gingerbread_MR1", "HONEYCOMB", "HONEYCOMB_MR1", "HONEYCOMB_MR2",
        "ICE_CREAM_SANDWICH", "ICE_CREAM_SANDWICH_MR1",
        "JELLY_BEAN", "JELLY_BEAN_MR1", "JELLY_BEAN_MR2", "KitKat", "KitKat_WATCH",
        "Lollipop", "Lollipop_MR1", "Marshmallow", "NOUGAT", "OREO", "OREO_MR1"
};
int nameIndex = Build.VERSION.SDK_INT - 1;
if (nameIndex < versionNames.length) {
    versionName = versionNames[nameIndex];
}

Évidemment, cela dérive des réponses des autres. D'après mon expérience, les gens n'aiment pas cela lorsque vous essayez de modifier une réponse existante pour l'améliorer, d'où la création d'une nouvelle.

0
Jon McClung

J'ai appliqué la solution ci-dessus, mais je n'étais pas très satisfait des noms de version "O" et "N". J'ai donc apporté quelques modifications. J'espère que ça sera utile pour les autres aussi

    /**
 * Gets the version name from version code. Note! Needs to be updated
 * when new versions arrive, or will return a single letter. Like Android 8.0 - Oreo
 * yields "O" as a version name.
 * @return version name of device's OS
 */
private static String getOsVersionName() {
    Field[] fields = Build.VERSION_CODES.class.getFields();
    String name =  fields[Build.VERSION.SDK_INT + 1].getName();

    if(name.equals("O")) name = "Oreo";
    if(name.equals("N")) name = "Nougat";
    if(name.equals("M")) name = "Marshmallow";

    if(name.startsWith("O_")) name = "Oreo++";
    if(name.startsWith("N_")) name = "Nougat++";

    return name;
}
0
RexSplode

La réflexion ne fonctionne pas lorsque j'ai essayé d'utiliser un émulateur fonctionnant sur l'API 19.

Je propose donc une réponse hybride de "Nacho Coloma" et "Kevin Grant"

String osName="";
Field[] fields = Build.VERSION_CODES.class.getFields();
for (Field field : fields) {
    String fieldName = field.getName();
    int fieldValue = -1;

    try {
        fieldValue = field.getInt(new Object());
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }

    if (fieldValue == Build.VERSION.SDK_INT) {
        osName=fieldName; break;
    }
}
if(osName.isEmpty()) {
    String[] mapper = new String[]{
            "Android BASE", "Android BASE 1.1", "CUPCAKE", "DONUT",
            "Eclair", "Eclair_0_1", "Eclair_MR1", "FROYO",
            "Gingerbread", "Gingerbread_MR1", "HONEYCOMB", "HONEYCOMB_MR1",
            "HONEYCOMB_MR2", "ICE_CREAM_SANDWICH", "ICE_CREAM_SANDWICH_MR1", "JELLY_BEAN",
            "JELLY_BEAN", "JELLY_BEAN", "KitKat", "KitKat",
            "LOLLIPOOP", "LOLLIPOOP_MR1", "Marshmallow", "NOUGAT",
            "NOUGAT", "OREO", "OREO", "Android P"};
    int index = Build.VERSION.SDK_INT - 1;
    osName = index < mapper.length ? mapper[index] : "UNKNOWN_VERSION";
}
0