¿Cómo obtener el número de compilación / versión de tu aplicación de Android?

Tengo que averiguar cómo obtener o crear un número de compilación para mi aplicación de Android. Necesito el número de compilación para mostrar en la interfaz de usuario.

¿Tengo que hacer algo con AndroidManifest.xml ?

Utilizar:

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

Y puede obtener el código de la versión utilizando este

  int verCode = pInfo.versionCode; 

Si está utilizando el complemento Gradle / Android Studio, a partir de la versión 0.7.0 , el código de versión y el nombre de la versión están disponibles estáticamente en BuildConfig . Asegúrese de importar el paquete de su aplicación y no otro BuildConfig :

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

No se necesita ningún objeto de contexto.

También asegúrese de especificarlos en su archivo build.gradle lugar de AndroidManifest.xml .

 defaultConfig { versionCode 1 versionName "1.0" } 

Versión ligeramente más corta si sólo desea el nombre de la versión.

 String versionName = context.getPackageManager() .getPackageInfo(context.getPackageName(), 0).versionName; 

Uso de Gradle y BuildConfig

Cómo obtener VERSION_NAME de BuildConfig

 BuildConfig.VERSION_NAME 

Sí, es así de fácil ahora.

¿Está devolviendo una cadena vacía para VERSION_NAME?

Si obtiene una cadena vacía para BuildConfig.VERSION_NAME , BuildConfig.VERSION_NAME leyendo.

Seguí recibiendo una cadena vacía para BuildConfig.VERSION_NAME porque no estaba estableciendo el nombre de versionName en mi archivo de compilación Grade (migré de ANT a Gradle). Así que, aquí hay instrucciones para asegurar que está configurando su VERSION_NAME través de Gradle.

Construir un gradiente

 def versionMajor = 3 def versionMinor = 0 def versionPatch = 0 def versionBuild = 0 // bump for dogfood builds, public betas, etc. android { defaultConfig { versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild versionName "${versionMajor}.${versionMinor}.${versionPatch}" } } 

Nota: Esto es del maestro Jake Wharton .

Eliminación de versionName y versionCode de AndroidManifest.xml

Y puesto que has configurado el nombre de versionCode y el build.gradle versionCode en el archivo build.gradle ahora, también puedes eliminarlos del archivo AndroidManifest.xml , si están allí.

Hay dos partes que necesita: android: versionCode android: versionName

VersionCode es un número y cada versión de la aplicación que envías al Market necesita tener un número más alto que el último.

VersionName es una cadena, y puede ser cualquier cosa que quieras que sea. Aquí es donde define su aplicación como "1.0" o "2.5" o "2 Alpha EXTREME!" o lo que sea.

Ejemplo:

Para acceder a él en código, haga algo como:

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

Aquí está una solución limpia , basada en la solución de scottyab (editada por Xavi). Muestra cómo obtener el contexto en primer lugar, si no es proporcionado por su método. Además, utiliza varias líneas en lugar de llamar a varios métodos por línea. Esto hace que sea más fácil cuando tiene que depurar su aplicación.

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

Ahora que recibió el nombre de la versión en el String myVersionName , puede establecerlo en un TextView o lo que quiera.

 // set version name to a TextView TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName); tvVersionName.setText(myVersionName); 

Si utiliza PhoneGap, cree un complemento PhoneGap personalizado:

Crea una nueva clase en el paquete de tu aplicación:

 package com.Demo; //replace with your package name import org.json.JSONArray; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import com.phonegap.api.Plugin; import com.phonegap.api.PluginResult; import com.phonegap.api.PluginResult.Status; public class PackageManagerPlugin extends Plugin { public final String ACTION_GET_VERSION_NAME = "GetVersionName"; @Override public PluginResult execute(String action, JSONArray args, String callbackId) { PluginResult result = new PluginResult(Status.INVALID_ACTION); PackageManager packageManager = this.ctx.getPackageManager(); if(action.equals(ACTION_GET_VERSION_NAME)) { try { PackageInfo packageInfo = packageManager.getPackageInfo( this.ctx.getPackageName(), 0); result = new PluginResult(Status.OK, packageInfo.versionName); } catch (NameNotFoundException nnfe) { result = new PluginResult(Status.ERROR, nnfe.getMessage()); } } return result; } } 

En el archivo plugins.xml, agregue la siguiente línea:

 <plugin name="PackageManagerPlugin" value="com.Demo.PackageManagerPlugin" /> 

En su evento deviceready , agregue el código siguiente:

 var PackageManagerPlugin = function() { }; PackageManagerPlugin.prototype.getVersionName = function(successCallback, failureCallback) { return PhoneGap.exec(successCallback, failureCallback, 'PackageManagerPlugin', 'GetVersionName', []); }; PhoneGap.addConstructor(function() { PhoneGap.addPlugin('packageManager', new PackageManagerPlugin()); }); 

A continuación, puede obtener el atributo versionName haciendo:

 window.plugins.packageManager.getVersionName( function(versionName) { //do something with versionName }, function(errorMessage) { //do something with errorMessage } ); 

Derivado de aquí y aquí .

Una manera muy simple es:

 private String appVersion = BuildConfig.VERSION_NAME; 

Siempre hacerlo con try catch bloque:

 String versionName = "Version not found"; try { versionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; Log.i(TAG, "Version Name: " + versionName); } catch (NameNotFoundException e) { // TODO Auto-generated catch block Log.e(TAG, "Exception Version Name: " + e.getLocalizedMessage()); } 

He solucionado esto usando la clase de preferencia.

 package com.example.android; import android.content.Context; import android.preference.Preference; import android.util.AttributeSet; public class VersionPreference extends Preference { public VersionPreference(Context context, AttributeSet attrs) { super(context, attrs); String versionName; final PackageManager packageManager = context.getPackageManager(); if (packageManager != null) { try { PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); versionName = packageInfo.versionName; } catch (PackageManager.NameNotFoundException e) { versionName = null; } setSummary(versionName); } } } 

Aquí está el método para obtener el código de versión:

 public String getAppVersion() { String versionCode = "1.0"; try { versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; } catch (PackageManager.NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return versionCode; } 

Si desea utilizarlo en xml, a continuación, agregue debajo de la línea en su archivo gradle:

 applicationVariants.all { variant -> variant.resValue "string", "versionName", variant.versionName } 

Y luego usarlo en su xml como este:

 <TextView android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/versionName" /> 

Para usuarios de xamarin, use este código para obtener el nombre y el código de la versión

1) VersionName

 public string GetVersionName() { return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionName; } 

2) VersionCode

 public string GetVersionCode() { return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionCode; } 

Este código se mencionó anteriormente en piezas, pero aquí está de nuevo todo incluido. Necesita un bloque try / catch porque puede lanzar un "NameNotFoundException".

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

Espero que esto simplifique las cosas para alguien en el camino. 🙂

  package com.sqisland.android.versionview; import android.app.Activity; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textViewversionName = (TextView) findViewById(R.id.text); try { PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0); textViewversionName.setText(packageInfo.versionName); } catch (PackageManager.NameNotFoundException e) { } } } 

Alguien que no necesita BuildConfig información para la aplicación de la interfaz de usuario sin embargo quiere utilizar estos datos para establecer una configuración de trabajo de CI o de otros, como yo.

Hay un archivo generado automáticamente, BuildConfig.java, en el directorio del proyecto, siempre y cuando construya el proyecto correctamente.

{WORKSPACE} / build / generated / source / buildConfig / {debug | release} / {PACKAGE} /BuildConfig.java

 /** * Automatically generated file. DO NOT MODIFY */ package com.XXX.Project; public final class BuildConfig { public static final boolean DEBUG = Boolean.parseBoolean("true"); public static final String APPLICATION_ID = "com.XXX.Project"; public static final String BUILD_TYPE = "debug"; public static final String FLAVOR = ""; public static final int VERSION_CODE = 1; public static final String VERSION_NAME = "1.0.0"; } 

Dividir la información que necesita mediante script python u otras herramientas. He aquí un ejemplo:

 import subprocess #find your BuildConfig.java _BuildConfig = subprocess.check_output('find {WORKSPACE} -name BuildConfig.java', shell=True).rstrip() #get the version name _Android_version = subprocess.check_output('grep -n "VERSION_NAME" '+_BuildConfig, shell=True).split('"')[1] print('Android version :'+_Android_version) 

Disculpe por favor mi capacidad inglesa limitada, pero espero que esto ayude.

Primero:

 import android.content.pm.PackageManager.NameNotFoundException; 

Y luego usar esto:

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

Pruebe este

 try { device_version = getPackageManager().getPackageInfo("com.google.android.gms", 0).versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } 
 private String GetAppVersion(){ try { PackageInfo _info = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0); return _info.versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return ""; } } private int GetVersionCode(){ try { PackageInfo _info = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0); return _info.versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return -1; } } 

Ejemplo para el uso de fragmentos en el interior.

  import android.content.pm.PackageManager; ....... private String VersionName; private String VersionCode; ....... Context context = getActivity().getApplicationContext(); /*Getting Application Version Name and Code*/ try { VersionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; /*I find usefull to convert vervion code into String, so it's ready for TextViev/server side checks*/ VersionCode = Integer.toString(context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } // DO SOMETHING USEFULL WITH THAT 
  • Cómo obtener la cadena de paquetes del manifiesto de Android
  • Android 4.4 (KITKAT) El API LEVEL 19 no aparece en Android SDK Manager
  • Cómo decir AndroidManifest.xml de la aplicación take @string desde un paquete específico
  • Recepción de datos para el esquema de url personalizado en Android
  • Aplicación de Android vs. Actividad
  • Intento-filtro con androide: establecimiento de prioridad
  • Permiso del receptor de facturación en la aplicación
  • Advertencias Su apk está utilizando permisos que requieren una política de privacidad: (android.permission.READ_PHONE_STATE)
  • Valor de versión de usuario de AndroidManifest.xml en código
  • Habilitar la depuración USB (bajo configuración / aplicaciones / desarrollo) mediante programación desde una aplicación
  • Personalizar la casilla de verificación preferencia
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.