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

1037

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

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

  • 1
    Не уверен, но я думаю, что вы можете получить его, проанализировав файл AndroidManifest.xml.
  • 1
    Дублировано: stackoverflow.com/questions/4471025/…
Показать ещё 1 комментарий
Теги:
android-emulator
android-manifest

28 ответов

1953

Использование:

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

И вы можете получить код версии с помощью этого

int verCode = pInfo.versionCode;
  • 0
    Приятное дополнение Феликса. Я исправлю ответ
  • 45
    @ Феликс, вы не можете вызвать getPackageManager () вне контекста, поэтому может потребоваться getApplicationContext () (или переданный контекст).
Показать ещё 17 комментариев
1567

Если вы используете плагин Gradle/Android Studio, от версии 0.7.0, код версии и имя версии доступны статически в BuildConfig, Убедитесь, что вы импортируете пакет приложений, а не другой BuildConfig:

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

Не требуется контекстный объект!

Также не забудьте указать их в файле build.gradle вместо AndroidManifest.xml.

defaultConfig {
    versionCode 1
    versionName "1.0"
}
  • 143
    Это на самом деле намного лучше, чем весь контекст и менеджер пакетов, спасибо.
  • 11
    На самом деле это лучшие решения после запуска Android Studio !!! +1 с моей стороны
Показать ещё 27 комментариев
409

Немного короче, если вам просто нужно имя версии.

String versionName = context.getPackageManager()
    .getPackageInfo(context.getPackageName(), 0).versionName;
  • 76
    Отлично. Это, вероятно, должно быть окружено try / catch для исключения NameNotFoundException.
  • 5
    +1 Я реализовал ваше решение, которое прекрасно работает! Тем не менее, это решение должно быть окружено методом «попробуй и пойми», как сказал Игорь, И это хорошая практика (например, для отладки), чтобы каждый вызов метода помещался в отдельную строку вместо вызова context.methodName (). SubMethod (). AnotherSubMethod () и т. Д. на одной строке. Поэтому я предоставил более чистое решение ниже
Показать ещё 5 комментариев
127

Использование Gradle и BuildConfig

Получение VERSION_NAME из BuildConfig

BuildConfig.VERSION_NAME

Да, теперь это легко.

Возвращает ли пустая строка для VERSION_NAME?

Если вы получаете пустую строку для BuildConfig.VERSION_NAME, то читайте дальше.

Я продолжал получать пустую строку для BuildConfig.VERSION_NAME, потому что я не устанавливал versionName в файле сборки Grade (я перенес из ANT в Gradle). Итак, вот инструкции по обеспечению установки VERSION_NAME с помощью Gradle.

build.gradle

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

}

Примечание: это от мастерски Jake Wharton.

Удаление versionName и versionCode из AndroidManifest.xml

И поскольку теперь вы установили versionName и versionCode в файл build.gradle, вы также можете удалить их из своего файла AndroidManifest.xml, если они есть.

  • 3
    Это прекрасно работает, если вы обращаетесь к BuildConfig из проекта приложения, а не к библиотеке, используемой в проекте приложения. В противном случае вы получите BuildConfig для проекта библиотеки, а не приложения.
  • 0
    @JohnCummings Интересно ... не думал об этом.
Показать ещё 5 комментариев
123

Есть две части, которые вам нужны: Android: версия Код Android: версия Имя

versionCode - это число, и каждая версия приложения, которую вы отправляете в Маркет, должна иметь больший номер, чем последняя.

VersionName - это строка, которая может быть любой, какой вы хотите. Здесь вы определяете свое приложение как "1.0", "2.5" или "2 Alpha EXTREME!" или что угодно.

Пример:

Чтобы получить доступ к нему в коде, сделайте что-то вроде:

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();
  • 5
    Официальное описание android:versionCode для android:versionCode и android:versionName можно найти здесь: developer.android.com/tools/publishing/…
  • 2
    это в данном случае контекст .ie активность, Услуги .etc
Показать ещё 1 комментарий
70
BuildConfig.VERSION_NAME //version name from your build file
BuildConfig.VERSION_CODE //version code from your build file

Я не вижу необходимости получать его от менеджера пакетов

  • 8
    Если вы пишете библиотеку, у вас нет доступа к клиенту «BuildConfig», и вы должны получить его из другого места.
50

Вот чистое решение, основанное на решении scottyab (отредактированное Xavi). Он показывает, как сначала получить контекст, если он не предоставлен вашим методом. Кроме того, он использует несколько строк вместо вызова нескольких методов на строку. Это облегчает вам задачу отладки вашего приложения.

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

Теперь, когда вы получили имя версии в String myVersionName, вы можете установить его в TextView или все, что вам нравится.

// set version name to a TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);
  • 0
    единственно правильное решение.
  • 0
    спасибо большое мужик!
Показать ещё 2 комментария
24

Используйте класс BuildConfig

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

build.gradle (приложение)

 defaultConfig {
    applicationId "com.myapp"
    minSdkVersion 19
    targetSdkVersion 27
    versionCode 17
    versionName "1.0"
   }
22

Если вы используете PhoneGap, создайте собственный плагин PhoneGap:

Создайте новый класс в своем приложении:

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

В plugins.xml добавьте следующую строку:

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

В deviceready event добавьте следующий код:

var PackageManagerPlugin = function() {

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

Затем вы можете получить атрибут versionName, выполнив:

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

Получено из здесь и здесь.

  • 9
    Вопрос был не о PhoneGap. Ваш ответ может просто смутить людей.
  • 8
    @BobbyJ Нигде в вопросе, заголовке или тегах не указано, что вопрос был о нативном приложении. Это то, что появилось в Google, когда я искал ответ, и спасло бы меня несколько часов.
Показать ещё 3 комментария
21

Очень простой способ:

private String appVersion = BuildConfig.VERSION_NAME;
9

Для пользователей xamarin используйте этот код, чтобы получить имя и код версии

1) Название версии:

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

2) Код версии:

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

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

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;
}
  • 3
    Лучший метод - BuildConfig.VERSION_CODE
8

Всегда делайте это с блоком 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());
}
7

Если вы хотите использовать его в xml, добавьте строку ниже в файл gradle:

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

И затем используйте его на вашем xml следующим образом:

<TextView
        android:gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/versionName" />
  • 0
    Пожалуйста, проверьте, если все еще работает.
  • 1
    Да, это работает. Проверено с API 23.
7

У меня есть SOLVE this, используя класс предпочтений.

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

Есть несколько способов получить 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();
}
  1. Получите его из сгенерированного BuildConfig.java. Но обратите внимание, что если вы получите доступ к этим значениям в библиотеке, она вернет версию библиотеки, а не приложения, использующие эту библиотеку. Так что используйте только в небиблиотечных проектах!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

Есть некоторые детали, кроме использования второго способа в проекте библиотеки. В новом плагине Android Gradle (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
    }
}
4

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

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

Надеюсь, это упростит для кого-то дорогу.:)

4

Кому-то, кому нужна информация о 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 script или других инструментов. Вот пример:

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)

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

3
 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) {

    }

  }
}
  • 0
    Привет, @donmj. Если вы используете ООН официальный рут для устройства Android. Я думаю, вам понадобится. Это мой подход.
  • 0
    Спасибо за помощь @Durul Dalkanat :).
2

попробуйте следующее:

try 
{
    device_version =  getPackageManager().getPackageInfo("com.google.android.gms", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
    e.printStackTrace();
}
2
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

Во-первых:

import android.content.pm.PackageManager.NameNotFoundException;

а затем используйте это:

PackageInfo pInfo = null;
try {
     pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
     e.printStackTrace();
            }
String versionName = pInfo.versionName;
  • 0
    нет нулевой проверки для pInfo?
  • 1
    разве ни у кого нет времени на это.
1

Поскольку мне нужно было получить только код версии и проверить, обновлено ли приложение или нет, если да, мне пришлось запустить PlayStore, чтобы получить обновленный. Я так и сделал.

public class CheckForUpdate {

public static final String ACTION_APP_VERSION_CHECK="app-version-check";

public static void launchPlayStoreApp(Context context)
{

    final String appPackageName = context.getPackageName(); // getPackageName() from Context or Activity object
    try {
        context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
    } catch (android.content.ActivityNotFoundException anfe) {
        context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
    }

}

public static int getRemoteVersionNumber(Context context)
{
    int versionCode=0;
    try {
        PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
        String version = pInfo.versionName;
        versionCode=pInfo.versionCode;
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    return versionCode;
}

}

Затем я сохранил код версии, используя общие настройки, создав класс util.

public class PreferenceUtils {

// this is for version code
private  final String APP_VERSION_CODE = "APP_VERSION_CODE";
private  SharedPreferences sharedPreferencesAppVersionCode;
private SharedPreferences.Editor editorAppVersionCode;
private static Context mContext;

public PreferenceUtils(Context context)
{
    this.mContext=context;
    // this is for app versioncode
    sharedPreferencesAppVersionCode=mContext.getSharedPreferences(APP_VERSION_CODE,MODE_PRIVATE);
    editorAppVersionCode=sharedPreferencesAppVersionCode.edit();
}

public void createAppVersionCode(int versionCode) {

    editorAppVersionCode.putInt(APP_VERSION_CODE, versionCode);
    editorAppVersionCode.apply();
}

public int getAppVersionCode()
{
    return sharedPreferencesAppVersionCode.getInt(APP_VERSION_CODE,0); // as default  version code is 0
     }
   }
1

В файле активности

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

Я надеюсь, что это поможет вам...!

  • 1
    минус 1. То же, что и ответ ниже
1

Пример использования внутри фрагмента.

        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 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
  • 0
    Вы должны посмотреть на другие ответы, прежде чем публиковать свой ответ. например, для контекста вы делаете getActivity.getApplicationContext, если вы находитесь во фрагменте, то я могу понять, но если вы находитесь в деятельности, я не думаю, что вам нужно будет вызывать getActivity
  • 0
    В моем случае я сделал это для фрагмента. Код используется внутри onCreate
0

Вот простой способ получить название версии и код версии

String version_name=BuildConfig.VERSION_NAME;
int version_code=BuildConfig.VERSION_CODE; 
0
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
    Что ваш ответ добавляет по отношению к предыдущим ответам? Пожалуйста, не дублируйте ответы
0
  PackageInfo pinfo = null;
    try {
        pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    int versionNumber = pinfo.versionCode;
    String versionName = pinfo.versionName;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню