Как узнать номер сборки / версии вашего Android-приложения? - PullRequest
1155 голосов
/ 06 января 2011

Мне нужно выяснить, как получить или сделать номер сборки для моего приложения Android. Мне нужен номер сборки для отображения в пользовательском интерфейсе.

Должен ли я что-то делать с AndroidManifest.xml?

Ответы [ 27 ]

9 голосов
/ 28 мая 2014

Всегда делайте это с try catch блоком:

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());
}
9 голосов
/ 30 июня 2016

Вот способ получения кода версии:

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 голосов
/ 02 марта 2015

У меня есть решение с помощью класса предпочтений.

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 голосов
/ 21 февраля 2019

Нет, вам не нужно ничего делать с AndroidManifest.xml

В основном название и код версии вашего приложения в файле уровня приложения , в defaultConfig tag:

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

Примечание. Если вы хотите загрузить приложение в PlayStore, можно указать любое имя в качестве имени версии, но код версии должен отличаться от кода текущей версии, если это приложение уже находится в магазине Play..

Просто используйте следующий фрагмент кода, чтобы получить код версии & название версии из любого места в вашем приложении:

try {  
    PackageInfo pInfo =   context.getPackageManager().getPackageInfo(context.getPackageName(), 0);  
    String version = pInfo.versionName;  
    int verCode = pInfo.versionCode;  
} catch (PackageManager.NameNotFoundException e) {  
    e.printStackTrace();  
}  
7 голосов
/ 01 ноября 2017

Есть несколько способов получить versionCode и versionName программно.

  1. Получить версию из PackageManager.Это лучший способ для большинства случаев.
try {
    String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
    int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
Получить его из сгенерированного BuildConfig.java.Но обратите внимание, что если вы получите доступ к этим значениям в библиотеке, она вернет версию библиотеки, а не приложения, использующие эту библиотеку.Так что используйте только в небиблиотечных проектах!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

Есть некоторые детали, кроме использования второго способа в библиотечном проекте.В новом плагине для Android (3.0.0+) некоторые функции удалены .Итак, на данный момент, т.е. установка другой версии для разных вкусов не работает правильно.

Неправильный путь:

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
}

Код выше будет правильно устанавливать значения в BuildConfig, но из PackageManagerвы получите 0 и null, если вы не установили версию в default конфигурации.Таким образом, ваше приложение будет иметь 0 код версии на устройстве.

Существует обходной путь - установите версию для вывода apk файла вручную:

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
    }
}
6 голосов
/ 14 февраля 2017

Этот код был упомянут выше по частям, но здесь он снова все включено.Вам нужен блок try / catch, потому что он может вызвать исключение NameNotFoundException.

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

Надеюсь, это упростит кому-то в будущем.:)

5 голосов
/ 21 февраля 2019

для Api 28 код PackageInfo.versionC устарел, поэтому используйте следующий код:

    Context context = getApplicationContext();
    PackageManager manager = context.getPackageManager();
    try {
        PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
        myversionName = info.versionName;
        versionCode = (int) PackageInfoCompat.getLongVersionCode(info);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        myversionName = "Unknown-01";
    }
5 голосов
/ 20 января 2016

Тот, кому не нужна информация BuildConfig для пользовательского интерфейса приложения, однако хочет использовать эту информацию для настройки конфигурации задания CI или других, таких как я.

Существует автоматически сгенерированный файл BuildConfig.java в каталоге вашего проекта, если вы успешно строите свой проект.

{WORKSPACE} / строить / генерироваться / источник / buildConfig / {отлаживать | выпуск} / {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";
}

Распределение необходимой информации с помощью сценария Python или других инструментов. Вот пример:

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)

Пожалуйста, извините за мои ограниченные знания английского, но надеюсь, что это поможет.

4 голосов
/ 10 мая 2019

Получить код сборки, который используется для идентификации apk по коду версии.Код версии используется для определения фактической конфигурации сборки во время обновления базы данных, публикации и т. Д.

int versionCode = BuildConfig.VERSION_CODE;

Имя версии используется для демонстрации пользователей или разработчиков.из последовательности Developmemt. Вы можете добавить любое имя версии по своему желанию

String versionName = BuildConfig.VERSION_NAME;

4 голосов
/ 03 февраля 2017

попробуйте это:

try 
{
    device_version =  getPackageManager().getPackageInfo("com.google.android.gms", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
    e.printStackTrace();
}
...