¿Cómo puede obtener el número de versión de manifiesto de las variables XML de la aplicación (diseño)?


184

Me gustaría tener una manera de hacer referencia al número de versión de manifiesto del proyecto en la parte principal del código. Lo que he estado haciendo hasta ahora es vincular el número de versión en un archivo XML de cadena al manifiesto (@ cadena / Versión). Lo que me gustaría hacer es hacerlo al revés, vincular una variable XML de cadena a la versión en el manifiesto. ¿La razón? Me gustaría tener que cambiar el número de versión en una ubicación, el archivo de manifiesto. ¿Hay alguna forma de hacer esto? ¡Gracias!


17
Esto NO es un duplicado. La pregunta en cuestión pregunta cómo hacer lo mismo en CODE, estoy preguntando en XML. Dos construcciones muy diferentes en la programación de Android ...
PearsonArtPhoto

Respuestas:


367

Creo que eso ya fue respondido aquí .

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

O

int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;

8
Casi, pero no del todo ... Lo que me gustaría hacer es hacer referencia a un código de XML, pero parece que podría no ser posible, así que ...
Pearsonartphoto

¡¡¡Muchas gracias!!! He estado buscando por todas partes para esto:String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
Aaron Klap

1
@ Shubh, no lo creo.
Konstantin Burov

3
Agregue BuildConfig.VERSION_NAME a su respuesta para los frenos gradle.
jobbert

102

No hay una forma de sacar directamente la versión, pero hay dos soluciones que podrían hacerse.

  1. La versión podría almacenarse en una cadena de recursos y colocarse en el manifiesto mediante:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.somepackage"
         android:versionName="@string/version" android:versionCode="20">
  2. Se podría crear una vista personalizada y colocarla en el XML. La vista usaría esto para asignar el nombre:

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

Cualquiera de estas soluciones permitiría colocar el nombre de la versión en XML. Desafortunadamente, no hay una solución simple y agradable, android.R.string.versiono algo así.


14
una pequeña nota a 1 .: está funcionando pero creo que está desanimado ya que recibo una advertencia que me diceThe android:versionName cannot be a resource url, it must be a literal string
Griddo

1
Lo que hice fue dejar intacto el nombre de la versión de manifiesto (pero actualizarlo cada vez que se publique una nueva versión) y usar string.xml para almacenar el valor que usaré en la aplicación.
numediaweb

1
Para AndroidStudio, el manifiesto versionNamees anulado por el que está en el build.gradlearchivo
Adrian C.

67

Puede usar los versionNamerecursos en XML, como los diseños de actividad. Primero cree un recurso de cadena en el app/build.gradlecon el siguiente fragmento de código en el androidnodo:

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

Entonces todo build.gradleel contenido del archivo puede verse así:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion '24.0.0 rc3'
    defaultConfig {
        applicationId 'com.example.myapplication'
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 17
        versionName '0.2.3'
        jackOptions {
            enabled true
        }
    }
    applicationVariants.all { variant ->
        variant.resValue "string", "versionName", variant.versionName
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
} 

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'com.android.support:design:23.3.0'
    compile 'com.android.support:support-v4:23.3.0'
}

Entonces puedes usar @string/versionNameen el XML. Android Studio lo marcará en rojo, pero la aplicación se compilará sin problemas. Por ejemplo, esto se puede usar así en app/src/main/res/xml/preferences.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory
        android:title="About"
        android:key="pref_key_about">

        <Preference
            android:key="pref_about_build"
            android:title="Build version"
            android:summary="@string/versionName" />

    </PreferenceCategory>


</PreferenceScreen>


3
Esto es mejor que el estilo programático.
Neurotransmisor

2
Maravillosa solución Gracias una tonelada.
Samik Bandyopadhyay

2
Estoy usando lo último y todavía funciona para mí. Yo uso esta y varias otras variables como esta. @ k2col, ¿qué error se obtiene al compilar? Pls publica tu código gradle
Arun Shankar

3
Esta debería considerarse la mejor respuesta.
pepan

15

Resolví este problema extendiendo 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);
        }
    }
}

Luego, en mis preferencias XML:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <com.example.android.VersionPreference android:title="Version" />
</PreferenceScreen>

Ups Debo haber estado pensando en Preferencia XML basado en otro comentario.
Seastland

Sin embargo, simplemente copiaré y pegaré su respuesta de todos modos.
Mathijs Segers

13

Yo uso BuildConfig.VERSION_NAME.toString();. ¿Cuál es la diferencia entre eso y obtenerlo del packageManager?

No hay soluciones basadas en XML que me hayan funcionado, lo siento.


77
BuildConfig.VERSION_NAME ya es una cadena, no es necesario llamar a toString () en ella.
Makotosan

Hábito. Bastante justo
Mullazman

Hay casos en los que llamar a esto en su proyecto puede obtener un resultado diferente al esperado. Por ejemplo, si usa un submódulo de Android en su proyecto y lo llama desde el código del submódulo, hará referencia a la configuración de compilación del submódulo que puede tener una versión diferente. O si lo llama desde el código de su proyecto, puede hacer referencia por error para construir la configuración de su submódulo y obtener el mismo resultado. Solo tenga cuidado y verifique que haga referencia a un paquete adecuado de la configuración de compilación.
MikeL

Intente usar esta guía: medium.com/@manas/…
CrandellWS

La diferencia es que BuilConfig es proporcionado por Gradle, mientras que obtenerlo en tiempo de ejecución es por PackageManager (OS)
Ishaan Kumar

12

SI está usando Gradle, puede usar el archivo build.gradle para agregar valor mediante programación a los recursos xml en tiempo de compilación.

Código de ejemplo extraído de: https://medium.com/@manas/manage-your-android-app-s-versioncode-versionname-with-gradle-7f9c5dcf09bf

buildTypes {
    debug {
        versionNameSuffix ".debug"
        resValue "string", "app_version", "${defaultConfig.versionName}${versionNameSuffix}"
    }
    release {
        resValue "string", "app_version", "${defaultConfig.versionName}"
    }
}

ahora use @string/app_versionsegún sea necesario en XML

Se agregará .debugal nombre de la versión como se describe en el artículo vinculado cuando esté en modo de depuración.


1
La mejor respuesta!
Raheel Hasan

2

No puede usarlo desde el XML.

Debe extender el widget que está utilizando en el XML y agregar la lógica para establecer el texto usando lo que se menciona en la respuesta de Konstantin Burov.


Tenía miedo de eso ... ¡Gracias por la ayuda!
PearsonArtPhoto

2
podemos usarlo Por favor revisa mi respuesta. Lo estoy usando en mi aplicación
Arun Shankar

1

La solución más fácil es usar BuildConfig.

Yo uso BuildConfig.VERSION_NAMEen mi aplicación.

También puede usar BuildConfig.VERSION_CODEpara obtener el código de versión.


-3

Tarde al juego, pero puedes hacerlo sin @string/xyzusar?android:attr

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="?android:attr/versionName"
     />
    <!-- or -->
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="?android:attr/versionCode"
     />

11
Lo uso así: <Preference android:title="Version" android:summary="?android:attr/versionName" ></Preference>pero mostrar como. ¿ ?16843292Qué pasa?
Suge

No estoy seguro, pero ¿creo que esto es para API posteriores?
Mafro34

@PearsonArtPhoto en realidad, ¿dónde dice eso?
Mafro34

no funciona devuelve un número divertido que @Suge señaló anteriormente
pepan

no funciona en absoluto y devuelve un valor aleatorio como se publicó anteriormente
A_rmas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.