Як отримати номер збірки / версії програми Android?


1286

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

Чи треба щось робити AndroidManifest.xml?


2
Не впевнений, але я думаю, що ви можете отримати це, розібравши файл AndroidManifest.xml.
Суніт Кумар Гупта


Щоб скористатись кодом версії int versionCode = BuildConfig.VERSION_CODE;та отримати назву версіїString versionName = BuildConfig.VERSION_NAME;
Лукас

Відповіді:


2040

Використання:

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

І ви можете отримати код версії, скориставшись цим

int verCode = pInfo.versionCode;

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

2
що робити, якщо вам потрібно це число всередині якогось статичного методу, де ви не можете передати контекст? поганий дизайн з мого боку?
Губатрон

35
І не забувайте, try... catch..колиgetPackageInfo()
антикафе

4
@Gubatron моя відповідь нижче дозволяє отримати ці значення статично.
Сем Дозор

25
Якщо ви хочете отримати лише версію програми, це дві складні. Ви повинні використовувати, BuildConfig.VERSION_**як тут запропоновано .
Тимо Бахр

1914

Якщо ви використовуєте плагін 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"
}

177
Це насправді набагато краще, ніж усі менеджери контексту та пакунків, Дякую.
superjugy

16
Насправді це найкращі рішення після запуску Android Studio !!! +1 з мого боку
Dhruvil Patel

15
Це не дуже надійно. Найчастіше назва версії відображається як порожній рядок.
Біной Бабу

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

39
Вам потрібно буде імпортувати правильний пакет для цього:import com.yourapppackage.android.BuildConfig
Ерік Б.

437

Трохи коротша версія, якщо ви просто хочете назву версії.

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

81
Відмінно. Напевно, це повинно бути оточене спробувати / catch для NameNotFoundException.
ІгорГанапольський

6
+1 Я реалізував ваше рішення, яке чудово працює! Однак це рішення повинно бути оточене спробою лову, як сказав Ігор. І це добра практика (наприклад, для налагодження) ставити кожен виклик методу в окремий рядок замість виклику context.methodName (). SubMethod (). AnotherSubMethod () тощо . в одному рядку. Тому я запропонував більш чисте рішення нижче
Майкл

1
Це правильне рішення, дякую;) Але, як запропонував @IgorGanapolsky, його потрібно оточити спробувати / ловити :)
andrea.rinaldi

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

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

173

Вам потрібні дві частини: android: versionCode android: versionName

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)

Java:

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/…
Jeffro

2
це в цьому випадку Context .ie Activity, Service
.etc

3
коли ви вставляєте який-небудь зразок коду, корисно пояснити значення параметрів .... але всі можуть зрозуміти, що this.getPackageName()являє собою 0ви просто плюєте, немає поняття про значення
Рафаель Ліма,

Android Studio стверджує, що
версія коду

1
@RomanGherta Це як на API 28. Якщо ви пишете код, використовуючи що-небудь менше (або 8 років тому, коли ця відповідь була написана), вам все одно слід погодитися. Інша відповідь тут має оновлений метод.
Меркідеміс

145

Використання 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

Ось чистий розчин , заснований на розчині скоттяба (за редакцією 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();
}

Тепер, коли ви отримали ім'я версії в рядку 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" />

У своїй події , яка вже є пристроєм , додайте такий код:

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 помилку: Не вдається вирішити символ '@ string / versionName'
RJB

12

Ні, вам не потрібно нічого робити з AndroidManifest.xml

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

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

Примітка. Коли ви хочете завантажити додаток у магазині, ви можете вказати будь-яке ім’я як назву версії, але код версії повинен відрізнятися від поточного коду версії, якщо цей додаток уже є в магазині ігор.

Просто скористайтеся таким фрагментом коду, щоб отримати код версії та назву версії з будь-якої точки вашого додатка:

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

1
Версія API була застаріла в API 28. Як зазначено в документах, замість цього використовуйте longVersionCode; developer.android.com/reference/android/content/pm/…
Dan Abnormal

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
Jaydev

8

Я вирішив це за допомогою класу 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);
        }
    }
}

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

6

Цей код був згаданий вище частинами, але сюди він знову включений. Вам потрібен блок "try / catch", оскільки він може кидати "NameNotFoundException".

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

Я сподіваюся, що це спрощує речі для когось у дорозі. :)


5

Хтось, кому не потрібна інформація 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)

Вибачте, будь ласка, мої обмежені можливості англійської мови, але сподіваюся, що це допоможе.


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
Sahil Manchanda

У моєму випадку я зробив це для Fragment. Код використовується всередині onCreate
Sapphire91140

3

Приклад Котліна:

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

Оскільки мені довелося отримати лише код версії та перевірити, оновлено чи додаток, якщо так, мені довелося запустити магазин для оновлення, щоб оновити його. Я зробив так.

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

Корисно для систем побудови: існує файл, згенерований разом з вашим output.jsonAPK, який містить масив інформації для кожного згенерованого 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.