Jak uzyskać numer kompilacji / wersji aplikacji na Androida?

1285

Muszę dowiedzieć się, jak uzyskać lub utworzyć numer kompilacji dla mojej aplikacji na Androida. Potrzebuję numeru kompilacji do wyświetlenia w interfejsie użytkownika.

Czy muszę coś z tym zrobić AndroidManifest.xml?

Fahad Ali Shaikh
źródło
2
Nie jestem pewien, ale myślę, że można go uzyskać, analizując plik AndroidManifest.xml.
Sunit Kumar Gupta
Aby uzyskać kod wersji, użyj int versionCode = BuildConfig.VERSION_CODE;nazwy wersjiString versionName = BuildConfig.VERSION_NAME;
Lukas

Odpowiedzi:

2039

Posługiwać się:

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

Za pomocą tego możesz uzyskać kod wersji

int verCode = pInfo.versionCode;
plus-
źródło
52
@ Poprawka nie może wywoływać metody getPackageManager () poza kontekstem, więc może być potrzebna metoda getApplicationContext () (lub przekazany kontekst).
Sver
2
co jeśli potrzebujesz tego numeru w jakiejś statycznej metodzie, w której nie możesz przekazać kontekstu? zły projekt z mojej strony?
Gubatron,
35
I nie zapomnij, try... catch..kiedygetPackageInfo()
antybezpieczny
4
@Gubatron moja odpowiedź poniżej pozwala na statyczne pobieranie tych wartości.
Sam Dozor
25
Jeśli chcesz tylko uzyskać wersję aplikacji, jest to dwa skomplikowane. Powinieneś używać BuildConfig.VERSION_**zgodnie z sugestią tutaj .
Timo Bähr,
1913

Jeśli używasz wtyczki Gradle / Android Studio, od wersji 0.7.0 kod wersji i nazwa wersji są dostępne statycznie w BuildConfig. Upewnij się, że importujesz pakiet aplikacji , a nie inny BuildConfig:

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

Nie potrzebny obiekt kontekstowy!

Upewnij się również, że określono je w build.gradlepliku zamiast AndroidManifest.xml.

defaultConfig {
    versionCode 1
    versionName "1.0"
}
Sam Dozor
źródło
177
To jest o wiele lepsze niż cały menedżer kontekstu i pakietów, dziękuję.
superjugy
16
To najlepsze rozwiązania po uruchomieniu Android Studio !!! +1 z mojej strony
Dhruvil Patel
15
To niezbyt wiarygodne. Nazwa wersji przez większość czasu pojawia się jako pusty ciąg.
Binoy Babu,
20
@BinoyBabu, nigdy nie powinien pojawiać się jako pusty ciąg, jeśli versionNamew build.gradlepliku określono opcję dla swojej aplikacji .
Sam Dozor,
39
Aby to zadziałało, musisz zaimportować poprawny pakiet:import com.yourapppackage.android.BuildConfig
Eric B.
437

Nieco krótsza wersja, jeśli chcesz tylko nazwę wersji.

String versionName = context.getPackageManager()
    .getPackageInfo(context.getPackageName(), 0).versionName;
szkocja
źródło
81
Świetny. Prawdopodobnie powinno to być otoczone przez try / catch dla NameNotFoundException.
IgorGanapolsky
6
+1 Wdrożyłem twoje rozwiązanie, które działa świetnie! Jednak to rozwiązanie powinno być otoczone próbą złapania, jak powiedział Igor ORAZ dobrą praktyką (np. Do debugowania) jest umieszczanie każdego wywołania metody w osobnym wierszu zamiast wywoływania kontekstu.metodName (). SubMethod (). AnotherSubMethod () itp. na jednej linii. Dlatego poniżej
Michael
1
To właściwe rozwiązanie, dzięki;) Ale, jak sugeruje @IgorGanapolsky, musi być otoczone
metodą
2
dla korzystających z Gradle - istnieje prostsze rozwiązanie. Zobacz moją odpowiedź poniżej.
Sam Dozor
1
@Erwinus Z całego serca nie zgadzam się z pomysłem używania ogólnego wyjątku do łapania takich rzeczy. Bardziej szczegółowe wyjątki pokazują, że deweloper rozumie możliwe błędy.
IgorGanapolsky
173

Potrzebne są dwie części: android: wersjaKod android: wersjaNazwa

versionCode to liczba i każda wersja aplikacji przesłanej do usługi Market musi mieć wyższą liczbę niż ostatnia.

VersionName jest ciągiem znaków i może być dowolną wartością. Tutaj definiujesz swoją aplikację jako „1.0”, „2.5” lub „2 Alpha EXTREME!” lub cokolwiek.

Przykład:

Kotlin:

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)

Jawa:

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();
Merkidemis
źródło
6
Oficjalny opis Androida android:versionCodei android:versionNamemożna go znaleźć tutaj: developer.android.com/tools/publishing/…
Jeffro
2
to w tym przypadku jest kontekst. działalność, serwis
.etc
3
po wklejeniu przykładowego kodu przydatne jest wyjaśnienie znaczenia parametrów ... mimo że wszyscy mogą zrozumieć, co this.getPackageName()reprezentuje to, 0co po prostu naplułem, nie ma pojęcia o znaczeniu
Rafael Lima
Android Studio twierdzi, że wersja
Kod
1
@RomanGherta Od API 28. Jeśli piszesz kod używając czegoś mniej (lub 8 lat temu, kiedy została napisana ta odpowiedź), powinieneś być gotowy. Inna odpowiedź tutaj zawiera zaktualizowaną metodę.
Merkidemis
145

Korzystanie z Gradle i BuildConfig

Pobieranie VERSION_NAME z BuildConfig

BuildConfig.VERSION_NAME

Tak, teraz to takie proste.

Czy zwraca pusty ciąg dla VERSION_NAME?

Jeśli otrzymujesz pusty ciąg znaków, BuildConfig.VERSION_NAMEczytaj dalej.

Ciągle otrzymywałem pusty ciąg, BuildConfig.VERSION_NAMEponieważ nie versionNameustawiałem pliku kompilacji Grade (migrowałem z ANT do Gradle). Oto instrukcje, jak upewnić się, że ustawiasz VERSION_NAMEza pośrednictwem 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}"
  }

}

Uwaga: pochodzi od mistrzowskiego Jake'a Whartona .

Usuwanie versionNamei versionCodezAndroidManifest.xml

A ponieważ teraz ustawiłeś plik versionNamei versionCodew build.gradlepliku, możesz również usunąć je ze swojego AndroidManifest.xmlpliku, jeśli tam są.

Joshua Pinter
źródło
5
Działa to świetnie, o ile uzyskujesz dostęp do BuildConfig z projektu aplikacji, a nie biblioteki używanej w projekcie aplikacji. W przeciwnym razie otrzymasz BuildConfig dla projektu biblioteki, a nie aplikacji.
John Cummings,
@JohnCummings Interesujące ... nie myślałem o tym.
Joshua Pinter,
W ogóle nie działa versionName "1.2"i BuildConfig.VERSION_NAMEwróć empty. API> 21
Sojtin
W ramach kontynuacji faktycznie przestaliśmy używać tej metody na rzecz tylko statycznej liczby całkowitej i statycznego ciągu odpowiednio dla versionCodei versionName. Tylko dlatego, że niektóre narzędzia, takie jak Code Push, próbują uzyskać numer wersji podczas analizowania build.gradlepliku i nie mogą uzyskać pełnej wartości dynamicznej.
Joshua Pinter
@JoshuaPinter PackageManager naprawdę jest najbezpieczniejszą opcją. Jeśli używasz zastępowania kodu wersji dla podziałów, stała BuildConfig nadal zachowuje oryginalną (aczkolwiek o smaku) wartość.
Eugen Pechanec
54

Oto czyste rozwiązanie oparte na rozwiązaniu scottyab (pod redakcją Xavi). Pokazuje, jak najpierw uzyskać kontekst, jeśli nie jest udostępniony przez twoją metodę. Ponadto wykorzystuje wiele linii zamiast wywoływać wiele metod na linię. Ułatwia to debugowanie aplikacji.

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

Teraz, gdy otrzymałeś nazwę wersji w ciągu myVersionName, możesz ustawić ją na TextView lub cokolwiek chcesz.

// set version name to a TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);
Michał
źródło
Czy uważasz, że NNFE można naprawdę rzucić?
Dziwnie
Jestem z tobą, że może to być dziwne, ale jest to domyślny wyjątek tej metody - patrz API : mówi Throws PackageManager.NameNotFoundException if a package with the given name can not be found on the system.. Nie wyobrażam sobie jednak takiego scenariusza!
Michael
38

Aby uzyskać wersję aplikacji lub kod kompilacji, który służy do identyfikowania apka według kodu wersji. Kod wersji służy do wykrywania faktycznej konfiguracji kompilacji w momencie aktualizacji, publikacji itp.

int versionCode = BuildConfig.VERSION_CODE;

Nazwa wersji służy do wyświetlania użytkowników lub programistów sekwencji programowania. Możesz dodać dowolną nazwę wersji, jak chcesz

String versionName = BuildConfig.VERSION_NAME;
Rohit Patil
źródło
34

Użyj klasy BuildConfig

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

build.gradle (aplikacja)

 defaultConfig {
    applicationId "com.myapp"
    minSdkVersion 19
    targetSdkVersion 27
    versionCode 17
    versionName "1.0"
   }
Velayutham M.
źródło
23

Jeśli używasz PhoneGap, utwórz niestandardową wtyczkę PhoneGap:

Utwórz nową klasę w pakiecie aplikacji:

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

W plugins.xml dodaj następujący wiersz:

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

W zdarzeniu już przygotowanym do urządzenia dodaj następujący kod:

var PackageManagerPlugin = function() {

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

Następnie można uzyskać atrybut versionName, wykonując:

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

Pochodzi tu i tutaj .

Sean Hall
źródło
9
Pytanie nie dotyczyło PhoneGap. Twoja odpowiedź może po prostu zmylić ludzi.
likebobby
8
@BobbyJ Nigdzie w pytaniu, tytule ani tagach nie podano, że pytanie dotyczyło aplikacji natywnej. To właśnie pojawiło się w Google, gdy szukałem odpowiedzi i zaoszczędziłoby mi kilka godzin.
Sean Hall
Dzięki Hall72215. Będę zadowolony z tego ... jeśli naprawdę nie ma innego sposobu na uzyskanie własnego numeru wersji? Wolę unikać wtyczki, jeśli to możliwe!
Magnus Smith,
@MagnusSmith Nie, chyba że PhoneGap / Cordova doda go do swoich wbudowanych funkcji.
Sean Hall,
W tym przykładzie możesz zobaczyć, jak głupie jest używanie rozwiązań innych firm do tworzenia aplikacji. Kiedy napisałeś to od zera, było to tylko kilka wierszy do zakodowania.
Codebeat
19

Jedlinianki Kotlin

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

Pamiętaj, aby zaimportować BuildConfigdo swojej klasy

Gastón Saillén
źródło
13

W przypadku użytkowników Xamarin użyj tego kodu, aby uzyskać nazwę i kod wersji

1) Nazwa wersji:

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

2) Kod wersji:

public string getVersionCode(){
      return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionCode;
}
Patel Tushar
źródło
12

Jeśli chcesz go użyć na xml, dodaj poniższy wiersz do pliku gradle:

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

A następnie użyj go na swoim xml w następujący sposób:

<TextView
        android:gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/versionName" />
Irfan Raza
źródło
Dostaję w swoim xml błąd: Nie można rozwiązać symbolu „@ string / versionName”
RJB
12

Nie, nie musisz nic robić z AndroidManifest.xml

Zasadniczo nazwa wersji aplikacji i kod wersji w pliku ocen poziomu aplikacji , pod tagiem defaultConfig :

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

Uwaga: jeśli chcesz załadować aplikację w sklepie playstore, możesz podać dowolną nazwę jako nazwę wersji, ale kod wersji musi być inny niż bieżący kod wersji, jeśli ta aplikacja jest już w sklepie Play.

Wystarczy użyć następującego fragmentu kodu, aby uzyskać kod wersji i nazwę wersji z dowolnego miejsca w aplikacji:

try {  
    PackageInfo pInfo =   context.getPackageManager().getPackageInfo(context.getPackageName(), 0);  
    String version = pInfo.versionName;  
    int verCode = pInfo.versionCode;  
} catch (PackageManager.NameNotFoundException e) {  
    e.printStackTrace();  
}  
Monir Zzaman
źródło
1
versionCode jest przestarzałe w API 28. Jak podano w dokumentacji, użyj zamiast tego longVersionCode; developer.android.com/reference/android/content/pm/…
Dan Abnormal
11

w przypadku interfejsu API 28 PackageInfo.versionCode jest przestarzały, więc użyj tego kodu poniżej:

    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";
    }
Amir jodat
źródło
9

Zawsze rób to z try catchblokiem:

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());
}
Pratik Butani
źródło
9

Oto metoda uzyskania kodu wersji:

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;
}
Gevaria Purva
źródło
3
Lepsza metoda - BuildConfig.VERSION_CODE
Jaydev
8

Rozwiązałem to za pomocą klasy preferencji.

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);
        }
    }
}
Shubham Gupta
źródło
8

Istnieje kilka sposobów na uzyskanie versionCodei versionNameprogramowo.

  1. Pobierz wersję z PackageManager. Jest to najlepszy sposób w większości przypadków.
try {
    String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
    int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
  1. Pobierz z wygenerowanego BuildConfig.java. Ale zauważ, że jeśli uzyskasz dostęp do tych wartości w bibliotece, zwróci wersję biblioteki, a nie aplikacji, która korzysta z tej biblioteki. Dlatego używaj tylko w projektach niebibliotecznych!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

Istnieje kilka szczegółów, z wyjątkiem użycia drugiego sposobu w projekcie biblioteki. W nowej wtyczce stopniowej Androida (3.0.0+) niektóre funkcje zostały usunięte . Na razie, tj. Ustawienie innej wersji dla różnych smaków nie działa poprawnie.

Niepoprawny sposób:

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
}

Powyższy kod poprawnie ustawi wartości w BuildConfig, ale od PackageManagerotrzymasz 0i nulljeśli nie ustawiłeś wersji w defaultkonfiguracji. Twoja aplikacja będzie mieć0 kod wersji na urządzeniu.

Istnieje obejście - apkręczne ustawienie wersji pliku wyjściowego :

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
    }
}
mohax
źródło
6

Ten kod został wspomniany powyżej w częściach, ale tutaj jest ponownie uwzględniony. Potrzebujesz bloku try / catch, ponieważ może on wygenerować „NameNotFoundException”.

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

Mam nadzieję, że uprości to komuś na drodze. :)

Jeff.H
źródło
5

Ktoś, kto nie potrzebuje informacji BuildConfig dla interfejsu użytkownika aplikacji, chce jednak użyć tych informacji do ustawienia konfiguracji zadania CI lub innych, takich jak ja.

W katalogu projektu znajduje się automatycznie wygenerowany plik BuildConfig.java, o ile pomyślnie zbudujesz projekt.

{WORKSPACE} / build / wygenerowane / 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";
}

Podziel potrzebne informacje według skryptu Python lub innych narzędzi. Oto przykład:

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)

Proszę wybaczyć moją ograniczoną znajomość języka angielskiego, ale mam nadzieję, że to pomoże.

JasonChiu
źródło
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) {

    }

  }
}
Durul Dalkanat
źródło
Cześć, @donmj. Jeśli używasz nieoficjalnego katalogu głównego dla urządzenia z Androidem. Myślę, że będziesz potrzebować. To jest moje podejście.
Durul Dalkanat
Dzięki za pomoc @Durul Dalkanat :).
donmj
4

Spróbuj tego:

try 
{
    device_version =  getPackageManager().getPackageInfo("com.google.android.gms", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
    e.printStackTrace();
}
Heenali Lakhani
źródło
3

Pierwszy:

import android.content.pm.PackageManager.NameNotFoundException;

a następnie użyj tego:

PackageInfo pInfo = null;
try {
     pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
     e.printStackTrace();
            }
String versionName = pInfo.versionName;
meduvigo
źródło
1
żadne ciało nie ma na to czasu.
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;
        }
    }
Atif Mahmood
źródło
3

Przykład użycia fragmentu wewnątrz.

        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
Szafirowe 91140
źródło
Powinieneś spojrzeć na inne odpowiedzi przed opublikowaniem odpowiedzi. np. dla kontekstu robisz getActivity.getApplicationContext, jeśli jesteś fragmentem, to rozumiem, ale jeśli jesteś w aktywności, nie sądzę, abyś musiał zadzwonić do getActivity
Sahil Manchanda
W moim przypadku zrobiłem to dla Fragment. Kod jest używany wewnątrz onCreate
Sapphire91140
3

Przykład Kotlina:

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

Nie dziękuj :-)

Alexander Gavriliuk
źródło
2
  PackageInfo pinfo = null;
    try {
        pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    int versionNumber = pinfo.versionCode;
    String versionName = pinfo.versionName;
janardhan
źródło
2

Ponieważ musiałem uzyskać tylko kod wersji i sprawdzić, czy aplikacja jest zaktualizowana, czy nie, jeśli tak, musiałem uruchomić playstore, aby go zaktualizować. Zrobiłem w ten sposób.

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

}

Następnie zapisałem kod wersji, korzystając z preferencji wspólnych, tworząc klasę 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
     }
   }
Ishwor Khanal
źródło
2

Podobnie jak w 2020 r .: API 28 „versionCode” jest przestarzałe, więc możemy użyć „longVersionCode”

Przykładowy kod w kotlin

  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
        }
Mayank Sharma
źródło
0

Przydatny w systemach kompilacji: plik o nazwie generowany jest z apk output.json który zawiera tablicę informacji dla każdego wygenerowanego APK, w tym nazwę wersji i kod wersji.

na przykład

[
    {
        "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": {}
    }
]
Tomek
źródło