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


1289

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

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


2
Не уверен, но я думаю, что вы можете получить его, проанализировав файл AndroidManifest.xml.
Сунит Кумар Гупта

1
Дублировано: stackoverflow.com/questions/4471025/…
xpto

Для получения кода версии используйте int versionCode = BuildConfig.VERSION_CODE;и для получения названия версииString versionName = BuildConfig.VERSION_NAME;
Lukas

Ответы:


2041

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

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

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

int verCode = pInfo.versionCode;

52
@ Феликс, вы не можете вызвать getPackageManager () вне контекста, поэтому может потребоваться getApplicationContext () (или переданный контекст).
Sver

2
что если вам нужно это число внутри какого-то статического метода, где вы не можете передать контекст? плохой дизайн с моей стороны?
Губатрон

35
И не забывайте, try... catch..когдаgetPackageInfo()
anticafe

4
@Gubatron мой ответ ниже позволяет получать эти значения статически.
Сэм Дозор

25
Если вы хотите получить только версию приложения, это две сложные. Вы должны использовать BuildConfig.VERSION_**как предложено здесь .
Тимо Бар

1921

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

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

Не нужен объект Context!

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

defaultConfig {
    versionCode 1
    versionName "1.0"
}

178
Это на самом деле намного лучше, чем весь контекст и менеджер пакетов, спасибо.
суперъюгий

16
На самом деле это лучшие решения после запуска Android Studio !!! +1 с моей стороны
Дхрувил Патель

15
Это не очень надежно. Название версии в большинстве случаев отображается в виде пустой строки.
Биной ​​Бабу

20
@BinoyBabu никогда не должен отображаться в виде пустой строки, если вы указали versionNameдля своего приложения в своем build.gradleфайле.
Сэм Дозор

39
Вам нужно будет импортировать правильный пакет, чтобы это работало:import com.yourapppackage.android.BuildConfig
Эрик Б.

438

Немного короче версия, если вы просто хотите название версии.

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

81
Отлично. Вероятно, он должен быть окружен try / catch для исключения NameNotFoundException.
Игорь Ганапольский

6
+1 Я реализовал ваше решение, которое прекрасно работает! Тем не менее, это решение должно быть окружено методом «попробуй и пойми», как сказал Игорь. И это хорошая практика (например, для отладки), чтобы каждый вызов метода помещался в отдельную строку вместо вызова context.methodName (). SubMethod (). AnotherSubMethod () и т. Д. на одной строке. Поэтому я предоставил более чистое решение ниже
Майкл

1
Это правильное решение, спасибо;) Но, как подсказывает @IgorGanapolsky, его нужно окружить try / catch :)
andrea.rinaldi

2
для тех, кто использует Gradle - есть более простое решение. Смотрите мой ответ ниже.
Сэм Дозор

1
@ Erwinus Я искренне не согласен с понятием использования общего исключения для ловли подобных вещей. Более детальные исключения демонстрируют понимание разработчиком возможных ошибок.
Игорь Ганапольский

174

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

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

6
Официальное описание Android android:versionCodeи android:versionNameего можно найти здесь: developer.android.com/tools/publishing/…
Джеффро

2
это в данном случае Контекстный .ie активность, Услуги .etc
peterchaula

3
когда вы вставляете какой-то пример кода, он полезен для объяснения значения параметров .... хотя каждый может понять, что this.getPackageName()представляет собой 0то, что вы просто плюете, он понятия не имеет о значении
Рафаэль Лима

Android-студия утверждает, что versionCode устарела
Роман Герта

1
@RomanGherta Это по состоянию на API 28. Если вы пишете код, используя что-то меньшее (или 8 лет назад, когда был написан этот ответ), вы все равно должны быть готовы. Другой ответ здесь имеет обновленный метод.
Merkidemis

146

Использование 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}"
  }

}

Примечание: это от мастерского Джейка Уортона .

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

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


5
Это прекрасно работает, если вы обращаетесь к BuildConfig из проекта приложения, а не к библиотеке, используемой в проекте приложения. В противном случае вы получите BuildConfig для проекта библиотеки, а не приложения.
Джон Каммингс

@JohnCummings Интересно ... не думал об этом.
Джошуа Пинтер

Не работает вообще versionName "1.2", а BuildConfig.VERSION_NAMEвозвращаюсь empty. API> 21
Сойтин

В качестве продолжения мы фактически прекратили использовать этот метод в пользу только статического целого числа и статической строки для versionCodeи versionName, соответственно. Только потому, что некоторые инструменты, такие как Code Push, пытаются получить ваш номер версии, анализируя ваш build.gradleфайл, и они не могут заполнить динамическое значение.
Джошуа Пинтер

@JoshuaPinter PackageManager действительно самый безопасный вариант. Если вы используете переопределения кода версии для разбиений, константа BuildConfig по-прежнему будет содержать исходное (хотя и ароматизированное) значение.
Евгений Печанец

54

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

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

Вы думаете, что NNFE может быть действительно брошено? Было бы странно не найти работающее приложение в менеджере пакетов :)
TWiStErRob

Я с вами, что это может быть странно, но это исключение по умолчанию для этого метода - см. API : там написано Throws PackageManager.NameNotFoundException if a package with the given name can not be found on the system.. Однако я не мог представить себе сценарий для этого!
Майкл

38

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

int versionCode = BuildConfig.VERSION_CODE;

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

String versionName = BuildConfig.VERSION_NAME;

34

Используйте класс 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"
   }

23

Если вы используете 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
    }
);

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


9
Вопрос был не о PhoneGap. Ваш ответ может просто смутить людей.
likebobby

8
@BobbyJ Нигде в вопросе, заголовке или тегах не указано, что вопрос был о нативном приложении. Это то, что появилось в Google, когда я искал ответ, и спасло бы меня несколько часов.
Шон Холл

Спасибо Hall72215. Я буду рад этому ... если нет другого способа получить свой номер версии? Я бы предпочел избегать плагин, если это возможно!
Магнус Смит

@MagnusSmith Нет, если PhoneGap / Cordova не добавили его в свои встроенные функции.
Шон Холл

В этом примере вы можете увидеть, как глупо использовать сторонние решения для создания приложений. Когда вы написали это сами с нуля, это было всего несколько строк кода.
Codebeat

19

Котлин однострочник

  val versionCode = BuildConfig.VERSION_CODE
  val versionName = BuildConfig.VERSION_NAME

Не забудьте импортировать BuildConfigв свой класс


13

Для пользователей 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;
}

12

Если вы хотите использовать его в 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" />

Я получаю в моей XML ошибки: не может символ решимости @ строки / versionName '
RJB

12

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

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

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

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

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

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

1
versionCode устарел в API 28. Как указано в документации, используйте longVersionCode; developer.android.com/reference/android/content/pm/…
Дэн Абнормаль

11

для Api 28 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";
    }

9

Всегда делайте это с 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

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

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

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

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

8

Есть несколько способов получить 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 (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

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

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

Я надеюсь, что это упрощает вещи для кого-то в будущем. :)


5

Однако тот, кому не нужна информация 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
 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) {

    }

  }
}

Привет, @donmj. Если вы используете ООН официальный рут для устройства Android. Я думаю, вам понадобится. Это мой подход.
Дурул Далканат

Спасибо за помощь @Durul Dalkanat :).
Donmj

4

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

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

3

Первый:

import android.content.pm.PackageManager.NameNotFoundException;

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

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

1
ни у кого нет времени для этого.
BlaShadow

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

3

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

        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

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

В моем случае я сделал это для фрагмента. Код используется внутри onCreate
Sapphire91140

3

Пример Kotlin:

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

Не благодари :-)


2
  PackageInfo pinfo = null;
    try {
        pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    int versionNumber = pinfo.versionCode;
    String versionName = pinfo.versionName;

2

Поскольку мне нужно было получить только код версии и проверить, обновлено ли приложение или нет, если да, мне пришлось запустить 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
     }
   }

2

Как и в 2020 году: API 28 "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
        }

0

Полезно для систем сборки: существует файл, сгенерированный с вашим 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": {}
    }
]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.