Мне нужно выяснить, как получить или сделать номер сборки для моего приложения Android. Мне нужен номер сборки для отображения в пользовательском интерфейсе.
Мне нужно что-то делать с AndroidManifest.xml
?
Мне нужно выяснить, как получить или сделать номер сборки для моего приложения Android. Мне нужен номер сборки для отображения в пользовательском интерфейсе.
Мне нужно что-то делать с AndroidManifest.xml
?
Использовать:
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
String version = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
И вы можете получить код версии, используя этот
int verCode = pInfo.versionCode;
getPackageName()
.
- person Kayla; 03.07.2014
try... catch..
, когда getPackageInfo()
- person anticafe; 07.07.2014
BuildConfig.VERSION_**
, как это предлагается здесь.
- person Timo Bähr; 20.06.2016
pInfo.versionCode
устарел в API 28
- person MHSFisher; 14.10.2018
Если вы используете плагин 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"
}
com.android.tools.build:gradle:1.3.0
- person Kushal; 18.02.2016
versionNameOverride
для динамической установки версии. Он покажет все, что было установлено вашим gradle как versionCode
, но это может отличаться от значения, хранящегося в вашем выпуске. В случае versionName
Это может также отличаться от того, что показано в списке магазинов.
- person tobltobs; 06.11.2019
Версия немного короче, если вам просто нужно название версии.
try{
String versionName = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return false;
}
Вам понадобятся две части:
versionCode - это число, и каждая версия приложения, которую вы представляете на рынок, должна иметь большее число, чем предыдущая.
VersionName - это строка, которая может быть чем угодно. Здесь вы определяете свое приложение как 1.0, 2.5 или 2 Alpha EXTREME! или что-то еще.
Пример:
Котлин:
val manager = this.packageManager
val info = manager.getPackageInfo(this.packageName, PackageManager.GET_ACTIVITIES)
toast("PackageName = " + info.packageName + "\nVersionCode = "
+ info.versionCode + "\nVersionName = "
+ info.versionName + "\nPermissions = " + info.permissions)
Джава:
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();
android:versionCode
и android:versionName
можно найти здесь: developer.android.com/ инструменты / публикация /
- person Jeffro; 19.07.2012
this.getPackageName()
представляет 0
, на который вы просто плюете, понятия не имеют о значении
- person Rafael Lima; 02.08.2018
BuildConfig.VERSION_NAME
Ага, теперь это так просто.
Если вы получаете пустую строку для BuildConfig.VERSION_NAME
, продолжайте читать.
Я продолжал получать пустую строку для BuildConfig.VERSION_NAME
, потому что я не устанавливал versionName
в моем файле сборки Grade (я перешел с Ant в Gradle). Итак, вот инструкции по настройке VERSION_NAME
через 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}"
}
}
Примечание. Это от искусного Джейка Уортона.
versionName
и versionCode
из AndroidManifest.xml
А поскольку вы сейчас установили versionName
и versionCode
в файле build.gradle
, вы также можете удалить их из своего AndroidManifest.xml
файла, если они там есть.
versionName "1.2"
и BuildConfig.VERSION_NAME
возвращают empty
. API ›21
- person Sojtin; 10.08.2016
versionCode
и versionName
соответственно. Только потому, что некоторые инструменты, такие как Code Push, пытаются получить номер вашей версии путем анализа вашего build.gradle
файла и не могут заполнить динамическое значение.
- person Joshua Pinter; 16.03.2018
2.6.23
, а в следующий раз вы хотите обновить 2.7.0
, вы получите код версии меньше, чем раньше. Поэтому я применил это: versionCode versionMajor * 10000 + versionMinor * 100 + versionPatch
versionPatch
от 0 до 100
- person 0x131313; 28.01.2019
import com.package.name.BuildConfig;
или напрямую ссылаетесь на него в коде, даже в библиотеке проекта;)
- person SkyzohKey; 01.06.2021
Вот чистое решение, основанное на решение 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 the version name to a TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);
Throws PackageManager.NameNotFoundException if a package with the given name can not be found on the system.
. Однако я не мог представить себе такого сценария!
- person Michael; 17.04.2016
Используйте следующее, чтобы получить версию приложения или код сборки, который используется для идентификации файла APK по его коду версии. Код версии используется для определения фактической конфигурации сборки во время обновления, публикации и т. Д.
int versionCode = BuildConfig.VERSION_CODE;
Название версии используется, чтобы показать пользователям или разработчикам последовательность разработки. Вы можете добавить любое название версии, какое захотите.
String versionName = BuildConfig.VERSION_NAME;
Используйте класс BuildConfig:
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;
defaultConfig {
applicationId "com.myapp"
minSdkVersion 19
targetSdkVersion 27
versionCode 17
versionName "1.0"
}
val versionCode = BuildConfig.VERSION_CODE
val versionName = BuildConfig.VERSION_NAME
Обязательно импортируйте BuildConfig
в свой класс.
String versionCode = String.valueOf(BuildConfig.VERSION_CODE);
String versionName = String.valueOf(BuildConfig.VERSION_NAME);
Если вы используете 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 добавьте следующий код:
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
}
);
Получено на основе здесь и .
Как в 2020 году: с API 28 (Android 9 (Pie)), versionCode устарел, поэтому мы можем использовать longVersionCode.
val manager = context?.packageManager
val info = manager?.getPackageInfo(
context?.packageName, 0
)
val versionName = info?.versionName
val versionNumber = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
info?.longVersionCode
} else {
info?.versionCode
}
Для API 28 (Android 9 (Pie)) PackageInfo.versionCode равен устарело, поэтому используйте этот код ниже:
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";
}
Если вы хотите использовать его в 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" />
Для пользователей Xamarin используйте этот код, чтобы получить название версии и код.
Название версии:
public string getVersionName(){
return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionName;
}
Код версии:
public string getVersionCode(){
return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionCode;
}
Обычно название и код версии вашего приложения находятся внутри файла уровня приложения Gradle в теге defaultConfig:
defaultConfig {
versionCode 1
versionName "1.0"
}
Примечание. Если вы хотите загрузить приложение в игровой магазин, оно может дать любое имя в качестве имени версии, но код версии должен отличаться от кода текущей версии, если это приложение уже находится в магазине воспроизведения. < / em>
Просто используйте следующий фрагмент кода, чтобы получить код версии и название версии из любого места вашего приложения:
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
String version = pInfo.versionName;
int verCode = pInfo.versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Всегда делайте это с 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());
}
Вот способ получения кода версии:
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;
}
Я решил эту проблему с помощью класса Preference.
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);
}
}
}
Есть несколько способов получить versionCode
и versionName
программно.
Получите версию от 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 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
}
}
название версии: BuildConfig.VERSION_NAME код версии: BuildConfig.VERSION_CODE
Этот код был упомянут выше по частям, но здесь он снова включен полностью. Вам нужен блок try / catch, потому что он может вызвать исключение NameNotFoundException.
try {
String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
}
catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Я надеюсь, что это упростит жизнь кому-то в будущем. :)
Для тех, кому не нужна информация BuildConfig для пользовательского интерфейса приложения, но желающих использовать эту информацию для настройки CI конфигурация задания или другие, такие как я:
Если вы успешно создаете проект, в каталоге вашего проекта есть автоматически сгенерированный файл BuildConfig.java.
{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";
}
Разделите необходимую информацию с помощью скрипта 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)
Попробуй это:
try
{
device_version = getPackageManager().getPackageInfo("com.google.android.gms", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
e.printStackTrace();
}
Первый:
import android.content.pm.PackageManager.NameNotFoundException;
а затем используйте это:
PackageInfo pInfo = null;
try {
pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
}
catch (NameNotFoundException e) {
e.printStackTrace();
}
String versionName = pInfo.versionName;
Пример использования внутреннего фрагмента.
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 it useful 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 useful with that
Поскольку мне нужно было получить только код версии и проверить, обновлено ли приложение или нет, если да, мне пришлось запустить игровой магазин, чтобы его обновить. Я так и сделал.
public class CheckForUpdate {
public static final String ACTION_APP_VERSION_CHECK = "app-version-check";
public static void launchPlayStoreApp(Context context)
{
// getPackageName() from Context or Activity object
final String appPackageName = context.getPackageName();
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 the 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 the default version code is 0
}
}
Пример Котлина:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.act_signin)
packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES).apply {
findViewById<TextView>(R.id.text_version_name).text = versionName
findViewById<TextView>(R.id.text_version_code).text =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) "$longVersionCode" else "$versionCode"
}
packageManager.getApplicationInfo(packageName, 0).apply{
findViewById<TextView>(R.id.text_build_date).text =
SimpleDateFormat("yy-MM-dd hh:mm").format(java.io.File(sourceDir).lastModified())
}
}
Полезно для систем сборки: есть файл, созданный с вашим файлом APK с именем output.json
, который содержит массив информации для каждого сгенерированного файла APK, включая versionName и versionCode.
Например,
[
{
"apkInfo": {
"baseName": "x86-release",
"enabled": true,
"filterName": "x86",
"fullName": "86Release",
"outputFile": "x86-release-1.0.apk",
"splits": [
{
"filterType": "ABI",
"value": "x86"
}
],
"type": "FULL_SPLIT",
"versionCode": 42,
"versionName": "1.0"
},
"outputType": {
"type": "APK"
},
"path": "app-x86-release-1.0.apk",
"properties": {}
}
]
int versionCode = BuildConfig.VERSION_CODE;
и чтобы получить имя версииString versionName = BuildConfig.VERSION_NAME;
- person Lukas   schedule 21.12.2019