1574 votes

Comment obtenir le numéro de build/version de votre application Android ?

Je dois trouver comment obtenir ou créer un numéro de build pour mon application Android. J'ai besoin que le numéro de build s'affiche dans l'interface utilisateur.

Est-ce que je dois faire quelque chose avec AndroidManifest.xml?

2 votes

Pas certain, mais je pense que vous pouvez l'obtenir en analysant le fichier AndroidManifest.xml.

1 votes

37 votes

Pour obtenir le code de version, utilisez int versionCode = BuildConfig.VERSION_CODE; et pour obtenir le nom de la version, utilisez String versionName = BuildConfig.VERSION_NAME;

2293voto

Sam Dozor Points 5709

Si vous utilisez le plugin Gradle/Android Studio, à partir de la version 0.7.0, le code de version et le nom de version sont disponibles statiquement dans BuildConfig. Assurez-vous d'importer le package de votre application, et non un autre BuildConfig:

import com.votrepackage.BuildConfig;
...
int versionCode = BuildConfig.VERSION_CODE;
String versionName = BuildConfig.VERSION_NAME;

Aucun objet Context requis!

Assurez-vous également de les spécifier dans votre fichier build.gradle au lieu du AndroidManifest.xml.

defaultConfig {
    versionCode 1
    versionName "1.0"
}

22 votes

Attention, pour un projet multi-module, vous pouvez obtenir des résultats inattendus lors de la requête de ceci dans un module spécifique. Il est probablement préférable de lier cela dans un espace de noms global dans votre classe Application/Activity principale.

0 votes

Existe-t-il un moyen d'obtenir le code de version de mon application qui se trouve sur le Play Store?

11 votes

Cela ne fonctionne pas si vous voulez l'utiliser dans un module de bibliothèque pour obtenir des informations sur l'application. Il n'y a pas de fichier BuildConfig dans le module de bibliothèque

2205voto

plus- Points 9661

Utilisez :

try {
    PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
    String version = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

Et vous pouvez obtenir le code de version en utilisant ceci

int verCode = pInfo.versionCode;

57 votes

@Felix vous ne pouvez pas appeler getPackageManager() en dehors du contexte, donc getApplicationContext() (ou le contexte passé) pourrait être nécessaire.

0 votes

Si vous obtenez null, veuillez vérifier le fichier AndroidManifest : probablement android:versionName est manquant.

4 votes

Qu'en est-il si vous avez besoin de ce numéro dans une méthode statique où vous ne pouvez pas passer le contexte? Mauvaise conception de ma part?

490voto

scottyab Points 6760

Légèrement plus courte si vous voulez juste le nom de la version.

try{
    String versionName = context.getPackageManager()
    .getPackageInfo(context.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return false;
}

91 votes

Excellent. Cela devrait probablement être entouré de try/catch pour NameNotFoundException.

6 votes

+1 J'ai implémenté votre solution qui fonctionne très bien! Cependant, cette solution devrait être entourée de try et catch comme l'a suggéré Igor ET il est bon de pratique (par exemple pour le débogage) de mettre chaque appel de méthode sur une ligne séparée au lieu d'appeler context.methodName().subMethod().anotherSubMethod()etc. sur une seule ligne. J'ai donc fourni une solution plus propre ci-dessous

1 votes

C'est la bonne solution, merci ;) Mais, comme suggéré par @IgorGanapolsky, cela doit être entouré de try / catch :)

210voto

Merkidemis Points 458

Il y a deux parties dont vous avez besoin:

  • android:versionCode
  • android:versionName

versionCode est un nombre, et chaque version de l'application que vous soumettez sur le marché doit avoir un nombre plus élevé que le précédent.

VersionName est une chaîne de caractères et peut être ce que vous voulez. C'est là que vous définissez votre application comme "1.0" ou "2.5" ou "2 Alpha EXTREME!" ou autre.

Exemple:

Kotlin:

val manager = this.packageManager
val info = manager.getPackageInfo(this.packageName, PackageManager.GET_ACTIVITIES)
toast("PackageName = " + info.packageName + "\nVersionCode = "
            + info.versionCode + "\nVersionName = "
            + info.versionName + "\nPermissions = " + info.permissions)

Java:

PackageManager manager = this.getPackageManager();
PackageInfo info = manager.getPackageInfo(this.getPackageName(), PackageManager.GET_ACTIVITIES);
Toast.makeText(this,
     "PackageName = " + info.packageName + "\nVersionCode = "
       + info.versionCode + "\nVersionName = "
       + info.versionName + "\nPermissions = " + info.permissions, Toast.LENGTH_SHORT).show();

6 votes

La description officielle d'Android de android:versionCode et android:versionName peut être trouvée ici : developer.android.com/tools/publishing/…

3 votes

Ceci dans ce cas est le Contexte, c'est-à-dire l'Activité, le Service, etc.

3 votes

Quand vous collez un extrait de code, il est utile d'expliquer la signification des paramètres.... même si tout le monde peut comprendre ce que this.getPackageName() représente, le 0 que vous venez de taper là n'a aucune indication sur sa signification

61voto

Michael Points 901

Voici une solution propre, basée sur la solution de scottyab (éditée par Xavi). Cela montre comment obtenir d'abord le contexte, s'il n'est pas fourni par votre méthode. De plus, cela utilise plusieurs lignes au lieu d'appeler plusieurs méthodes par ligne. Cela rend plus facile le débogage de votre application.

Context context = getApplicationContext(); // or activity.getApplicationContext()
PackageManager packageManager = context.getPackageManager();
String packageName = context.getPackageName();

String myVersionName = "not available"; // initialize String

try {
    myVersionName = packageManager.getPackageInfo(packageName, 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

Maintenant que vous avez reçu le nom de version dans la chaîne myVersionName, vous pouvez le définir sur un TextView ou tout ce que vous voulez..

// Définir le nom de version sur un TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);

3 votes

Pensez-vous que NNFE peut vraiment être lancé ? Ce serait étrange de ne pas trouver une application en cours d'exécution dans le gestionnaire de packages :)

1 votes

Je suis d'accord avec vous, cela pourrait sembler étrange, mais c'est l'exception par défaut de cette méthode - consultez l'API : elle indique Lance PackageManager.NameNotFoundException si un package avec le nom donné ne peut être trouvé sur le système.. Cependant, je ne peux pas imaginer de scénario pour cela !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X