Como obter o número de compilação / versão de sua aplicação Android?

Tenho de descobrir como obter ou criar um número de compilação para a minha aplicação Android. Preciso do número de construção para mostrar na IU.

Tenho de fazer alguma coisa com o AndroidManifest.xml?

Author: Peter O., 2011-01-06

26 answers

Utilizar:

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

E você pode obter o código de Versão usando este

int verCode = pInfo.versionCode;
 1816
Author: plus-, 2018-08-30 19:13:43

Se estiver a usar o 'plugin' do Gradle/Android Studio, a partir da versão 0. 7. 0 , o código da versão e o nome da versão estão disponíveis estaticamente em BuildConfig. certifique-se que importa o pacote da sua aplicação, e não Outro BuildConfig:

import com.yourpackage.BuildConfig;
...
int versionCode = BuildConfig.VERSION_CODE;
String versionName = BuildConfig.VERSION_NAME;
Não é necessário nenhum objecto de contexto!

Certifique-se também de os especificar no seu ficheiro build.gradle em vez do AndroidManifest.xml.

defaultConfig {
    versionCode 1
    versionName "1.0"
}
 1501
Author: Sam Dozor, 2017-02-06 15:09:57

Versão ligeiramente mais Curta se só quiser o nome da versão.

String versionName = context.getPackageManager()
    .getPackageInfo(context.getPackageName(), 0).versionName;
 406
Author: scottyab, 2013-05-23 21:09:12

Há duas partes que você precisa: android: versionCode android: versionName

VersionCode é um número, e cada versão do aplicativo que você submete para o mercado precisa ter um número maior do que o último.

O VersionName é uma string, e pode ser o que quiser que seja. É aqui que define o seu aplicativo como "1.0" ou "2.5" ou "2 Alpha EXTREME!"ou seja o que for.

Exemplo: Para aceder em código, faça algo do género:
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();
 127
Author: Merkidemis, 2013-01-23 16:18:49

Usando Gradle e BuildConfig

Obter o nome VERSION_ do BuildConfig

BuildConfig.VERSION_NAME
Sim, agora é fácil.

Está a devolver um texto vazio para o nome VERSION_?

Se você está recebendo um texto vazio para BuildConfig.VERSION_NAME então leia.

Continuei a receber um texto vazio por {[[2]} porque não estava a definir o versionName no meu ficheiro de Compilação de notas (eu migrei de ANT para Gradle). Então, aqui estão as instruções para garantir que você está ajustando seu VERSION_NAME via Gradle.

Construir.enxada

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: Isto é do mestre Jake Wharton .

Retirar versionName e versionCode de AndroidManifest.xml

E uma vez que você definiu o versionName e versionCode no arquivo build.gradle Agora, você também pode removê-los do seu arquivo AndroidManifest.xml, se eles estão lá.

 125
Author: Joshua Pinter, 2015-05-22 19:00:23
BuildConfig.VERSION_NAME //version name from your build file
BuildConfig.VERSION_CODE //version code from your build file

Não vejo necessidade de O obter do Gestor de pacotes

 57
Author: M. Usman Khan, 2018-03-18 19:17:17

Aqui está uma solução limpa, baseada na solução de scottyab (editada por Xavi). Ele mostra como obter o contexto primeiro, se não for fornecido pelo seu método. Além disso, utiliza várias linhas em vez de chamar vários métodos por linha. Isso torna mais fácil quando você tem que depurar sua aplicação.

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

Agora que você recebeu o nome da versão no texto {[[2]}, você pode configurá-lo para uma vista de texto ou o que quiser..

// set version name to a TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);
 50
Author: Michael, 2014-03-23 09:55:35

Se estiver a usar o PhoneGap, então crie um 'plugin' personalizado do PhoneGap:

Crie uma nova classe no pacote da sua aplicação:

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

Nos plugins.xml, adicionar a seguinte linha:

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

No seuevento deviceready , adicione o seguinte código:

var PackageManagerPlugin = function() {

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

Então, você pode obter o atributo versionName fazendo:

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

Derivado de aquie aqui.

 23
Author: Sean Hall, 2012-09-27 20:42:13

Uma maneira muito simples é:

private String appVersion = BuildConfig.VERSION_NAME;
 21
Author: android enthusiast, 2016-01-20 13:55:06

Fá-lo sempre com try catch Bloco:

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());
}
 8
Author: Pratik Butani, 2014-05-28 06:43:43

Aqui está o método para obter o código da versão:

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;
}
 8
Author: Gevaria Purva, 2016-06-30 07:39:18

Para os utilizadores do xamarin, use este código para obter o nome e o código da versão

1) Nome Da Versão:

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

2) Código Da Versão:

public string getVersionCode(){
      return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionCode;
}
 8
Author: Tushar patel, 2017-09-12 12:24:37
Tenho de resolver isto usando a classe de preferência.
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);
        }
    }
}
 7
Author: Shubham Gupta, 2015-03-02 11:07:29

Se o quiser usar em xml, então adicione abaixo da linha no seu ficheiro de gradle:

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

E depois usa - o no teu xml assim:

<TextView
        android:gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/versionName" />
 7
Author: Irfan Raza, 2016-05-26 19:30:03

Usar a classe BuildConfig

String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

Construir.gradle (app)

 defaultConfig {
    applicationId "com.myapp"
    minSdkVersion 19
    targetSdkVersion 27
    versionCode 17
    versionName "1.0"
   }
 5
Author: Velayutham M, 2018-07-25 04:46:27

Alguém que não precisa de Informações do BuildConfig para a interface da aplicação, no entanto, quer usar estas informações para definir uma configuração de trabalho do IC ou outros, como eu.

Existe um ficheiro gerado automaticamente, o BuildConfig.java, sob o directório do seu projecto, desde que construa o seu projecto com sucesso.

{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";
}

Divida a informação de que necessita pelo programa python ou por outras ferramentas. Aqui está um exemplo:

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)
Por favor, desculpa a minha limitada habilidade em inglês, mas espero que isto ajude.
 4
Author: JasonChiu, 2016-01-20 08:07:29

Este código foi mencionado acima em peças, mas aqui está novamente tudo incluído. Você precisa de um bloco de tentativa/captura porque ele pode lançar um"NameNotFoundException".

try {
   String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}
Espero que isto simplifique as coisas para alguém. :)
 4
Author: Jeff.H, 2017-02-14 16:34:24

Há algumas maneiras de chegar versionCode e versionName programaticamente.

  1. obter a versão de PackageManager. Esta é a melhor maneira para a maioria dos casos.
try {
    String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
    int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
  1. obter a partir de gerado BuildConfig.java. Mas note, que se você acessar esses valores na biblioteca ele devolverá a versão da biblioteca, não apps one, que usa esta biblioteca. Então usar apenas em projectos não-bibliotecários!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

Existem alguns detalhes, exceto de usar a segunda maneira no projeto da biblioteca. No novo plugin android gradle (3. 0+) algumas funcionalidades foram removidas. Então, por agora, ou seja, definir uma versão diferente para diferentes sabores não funcionando corretamente.

Modo incorrecto:

applicationVariants.all { variant ->
    println('variantApp: ' + variant.getName())

    def versionCode = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
    def versionName = {SOME_GENERATED_VALUE_IE_TIMESTAMP}

    variant.mergedFlavor.versionCode = versionCode
    variant.mergedFlavor.versionName = versionName
}

O código acima irá definir correctamente os valores em BuildConfig, mas a partir de PackageManager irá receber 0 e null Se não tiver definido a versão em default configuração. Então a sua aplicação terá o código de versão 0 no dispositivo.

Existe uma versão workaround - set para o ficheiro de saída apk manualmente:

applicationVariants.all { variant ->
    println('variantApp: ' + variant.getName())

    def versionCode = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
    def versionName = {SOME_GENERATED_VALUE_IE_TIMESTAMP}

    variant.outputs.all { output ->
        output.versionCodeOverride = versionCode
        output.versionNameOverride = versionName
    }
}
 4
Author: mohax, 2017-10-31 21:10:25
 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) {

    }

  }
}
 3
Author: Durul Dalkanat, 2015-05-17 06:16:10

Primeiro:

import android.content.pm.PackageManager.NameNotFoundException;

E depois usar isto:

PackageInfo pInfo = null;
try {
     pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
     e.printStackTrace();
            }
String versionName = pInfo.versionName;
 2
Author: meduvigo, 2015-02-27 15:17:52
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;
        }
    }
 2
Author: Atif Mahmood, 2016-11-18 11:12:24
Tenta este.
try 
{
    device_version =  getPackageManager().getPackageInfo("com.google.android.gms", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
    e.printStackTrace();
}
 2
Author: Heenali Lakhani, 2017-02-03 12:26:01

Em actividade ficheiro

final TextView text_1 = (TextView) findViewById(R.id.text_1);

String version= BuildConfig.VERSION_NAME;
int code = BuildConfig.VERSION_CODE;
text_1.setText("version Name :   "+version+ "Version Code : "+code);
Espero que te ajude...!
 2
Author: Viral Patel, 2018-06-14 09:43:39

Exemplo de utilização de fragmentos internos.

        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
 1
Author: Sapphire91140, 2017-07-16 23:25:35
  PackageInfo pinfo = null;
    try {
        pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    int versionNumber = pinfo.versionCode;
    String versionName = pinfo.versionName;
 1
Author: janardhan, 2017-12-28 06:12:24
try {
        PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        String versionName = packageInfo.versionName;
        int versionCode = packageInfo.versionCode;
        //binding.tvVersionCode.setText("v" + packageInfo.versionName);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
 0
Author: Shanmugavel GK, 2018-08-13 10:04:34