Android uygulamanızın derleme / sürüm numarası nasıl alınır?


1287

Android uygulamam için nasıl bir yapı numarası alacağımı veya yapılacağımı anlamam gerekiyor. Kullanıcı arayüzünde görüntülemek için yapı numarasına ihtiyacım var.

Bununla bir şey yapmam gerekiyor AndroidManifest.xmlmu?


2
Emin değilim, ama AndroidManifest.xml dosyasını ayrıştırarak alabileceğinizi düşünüyorum.
Sunit Kumar Gupta


Sürüm kodunu int versionCode = BuildConfig.VERSION_CODE;almak ve sürüm adını almak için kullanınString versionName = BuildConfig.VERSION_NAME;
Lukas

Yanıtlar:


2040

kullanın:

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

Ve bunu kullanarak sürüm kodunu alabilirsiniz

int verCode = pInfo.versionCode;

52
@Felix, bağlam dışında getPackageManager () öğesini çağıramazsınız, bu nedenle getApplicationContext () (veya geçirilen bağlam) gerekebilir.
Sver

2
bağlamı geçemeyeceğiniz bir statik yöntemde bu numaraya ihtiyacınız varsa ne olur? benim için kötü tasarım?
Gubatron

35
Ve unutmayın try... catch..zamangetPackageInfo()
anticafe

4
@Gubatron Aşağıdaki cevabım bu değerleri statik olarak almanıza izin veriyor.
Sam Dozor

25
Yalnızca uygulamanın sürümünü almak istiyorsanız bu iki derlemedir. BuradaBuildConfig.VERSION_** önerildiği gibi kullanmalısınız .
Timo Bähr

1915

Eğer Gradle eklentisi kullanarak ediyorsanız / Android Studio, sürümü 0.7.0 itibariyle , sürüm kodu ve versiyon adı statik mevcuttur BuildConfig. Başka bir paketi değil, uygulamanızın paketini içe aktardığınızdan emin olunBuildConfig :

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

İçerik nesnesi gerekmez!

Ayrıca, bunları build.gradledosyanızda yerine belirttiğinizden emin olun AndroidManifest.xml.

defaultConfig {
    versionCode 1
    versionName "1.0"
}

177
Bu aslında tüm içerik ve paket yöneticisinden çok daha iyi, teşekkürler.
superjugy

16
Aslında bu Android Studio piyasaya sürüldükten sonra en iyi çözüm !!!
Yanımdan

15
Çok güvenilir değil. Sürüm adı çoğu zaman boş bir dize olarak görünür.
Binoy Babu

20
@BinoyBabu versionName, build.gradledosyanızda uygulamanız için bir belirttiyseniz asla boş bir dize olarak gösterilmemelidir .
Sam Dozor

39
Bunun çalışması için doğru paketi almanız gerekecek:import com.yourapppackage.android.BuildConfig
Eric B.

437

Sadece sürüm adını istiyorsanız biraz daha kısa sürüm.

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

81
Mükemmel. Bu muhtemelen NameNotFoundException için try / catch ile çevrelenmelidir.
IgorGanapolsky

6
+1 Harika çalışan çözümünüzü uyguladım! Bununla birlikte, bu çözüm Igor'un dediği gibi dene ve yakala ile çevrelenmelidir VE her yöntem çağrısını bağlam.methodName (). SubMethod () çağırmak yerine ayrı bir satıra koymak iyi bir uygulamadır (örneğin hata ayıklama için). AnotherSubMethod () vb. tek bir satırda. Bu yüzden aşağıda
Michael

1
Bu doğru çözüm, teşekkürler;) Ancak, @IgorGanapolsky tarafından önerildiği gibi, denemek / yakalamak ile çevrili olması gerekir :)
andrea.rinaldi

2
Gradle kullanan kişiler için - daha basit bir çözüm var. Cevabımı aşağıda görebilirsiniz.
Sam Dozor

1
@Erwinus Bu tür şeyleri yakalamak için genel bir İstisna kullanma fikrine yürekten katılmıyorum. Daha ayrıntılı istisnalar, bir geliştiricinin olası hataları anladığını gösterir.
IgorGanapolsky

173

İhtiyacınız olan iki bölüm var: android: versionCode android: versionName

versionCode bir sayıdır ve Market'e gönderdiğiniz uygulamanın her sürümünün sondan daha yüksek bir sayıya sahip olması gerekir.

VersionName bir dizedir ve olmasını istediğiniz herhangi bir şey olabilir. Burada uygulamanızı "1.0" veya "2.5" veya "2 Alpha EXTREME!" ya da her neyse.

Misal:

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)

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'in resmi açıklaması android:versionCodeve android:versionNameburadan bulunabilir: developer.android.com/tools/publishing/…
Jeffro

2
Bu durumda bu İçerik .ie Etkinlik, Hizmet
.etc

3
bazı örnek kod yapıştırdığınızda parametrelerin anlamını açıklamak için yararlıdır .... althoug herkes sadece tüküren neyi this.getPackageName()temsil ettiğini anlayabilir0
Rafael Lima

Android Studio, VersionKodu kullanımdan kaldırıldı
Roman Gherta

1
@RomanGherta API 28'den itibaren. Daha az bir şey kullanarak kod yazıyorsanız (veya bu cevap yazıldığında 8 yıl önce) hala iyi gitmelisiniz. Burada başka bir cevap güncellenmiş yöntem var.
Merkidemis

145

Gradle ve BuildConfig Kullanımı

VERSION_NAME ürününü BuildConfig'den alma

BuildConfig.VERSION_NAME

Evet, şimdi bu kadar kolay.

VERSION_NAME için Boş Bir Dize mi Dönüyor?

Boş bir dize BuildConfig.VERSION_NAMEalıyorsanız okumaya devam edin.

Benim sınıf oluşturma dosyasında (ANT Gradle geçiş) BuildConfig.VERSION_NAMEayarlama değildi çünkü için boş bir dize almaya devam versionNameetti. İşte, VERSION_NAMEGradle üzerinden ayarladığınızdan emin olmak için talimatlar .

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

}

Not: Bu ustaca Jake Wharton'dan .

Çıkarma versionNameve versionCodegelenAndroidManifest.xml

Ve bu yana belirlemiş olduğunuz versionNameve versionCodede build.gradleşimdi dosyanın, aynı zamanda kaldırabilirsiniz AndroidManifest.xmlonlar varsa, dosyanın.


5
Bu, uygulama projesinde kullanılan bir kitaplık değil, BuildConfig uygulamasına uygulama projesinden eriştiğiniz sürece harika çalışır. Aksi takdirde, uygulama değil kütüphane projesi için BuildConfig alırsınız.
John Cummings

@JohnCummings İlginç ... bunu düşünmemiştim.
Joshua Pinter

Hiç çalışmıyor versionName "1.2", ve BuildConfig.VERSION_NAMEgeri dön empty. API> 21
Sojtin

Bir takip olarak, aslında bu yöntemi sırasıyla versionCodeve için statik bir tamsayı ve bir statik Dize lehine kullanmayı bıraktık versionName. Code Push gibi bazı araçlar build.gradledosyanızı ayrıştırarak sürüm numaranızı almaya çalışır ve dinamik bir değer dolduramazlar.
Joshua Pinter

@JoshuaPinter PackageManager gerçekten en güvenli seçenektir. Bölmeler için sürüm kodu geçersiz kılmaları kullanırsanız, BuildConfig sabiti orijinal (aromalı da olsa) değerini korur.
Eugen Pechanec

54

İşte scottyab (Xavi tarafından düzenlenmiş) çözümüne dayanan temiz bir çözüm . Yönteminiz tarafından sağlanmadıysa, bağlamın önce nasıl alınacağını gösterir. Ayrıca, hat başına birden çok yöntem çağırmak yerine birden çok satır kullanır. Bu, uygulamanızda hata ayıklamanız gerektiğinde kolaylaştırır.

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

Dize'de sürüm adını aldığınıza göre, myVersionNameartık bir TextView veya istediğiniz gibi ayarlayabilirsiniz.

// set version name to a TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);

Sizce NNFE gerçekten atılabilir mi? Paket yöneticisinde çalışan bir uygulama bulmak tuhaf olurdu :)
TWiStErRob

Garip olabileceğini biliyorum, ama bu yöntemin varsayılan istisnası - API'ya bakın : diyor Throws PackageManager.NameNotFoundException if a package with the given name can not be found on the system.. Ancak, bunun için bir senaryo hayal edemedim!
Michael

38

Uygulamanın sürümünü almak veya apk'yi sürüm koduna göre tanımlamak için kullanılan kodu oluşturmak için. Sürüm kodu, güncelleme, yayınlama vb. Sırasında gerçek derleme yapılandırmasını algılamak için kullanılır.

int versionCode = BuildConfig.VERSION_CODE;

Sürüm adı, geliştirme sırasının kullanıcılarını veya geliştiricilerini göstermek için kullanılır. İstediğiniz herhangi bir sürüm adını ekleyebilirsiniz

String versionName = BuildConfig.VERSION_NAME;

34

BuildConfig sınıfını kullanma

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

build.gradle (uygulama)

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

23

PhoneGap kullanıyorsanız, özel bir PhoneGap eklentisi oluşturun:

Uygulamanızın paketinde yeni bir sınıf oluşturun:

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 dosyasına aşağıdaki satırı ekleyin:

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

Senin içinde deviceready olay aşağıdaki kodu ekleyin:

var PackageManagerPlugin = function() {

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

Ardından, versionName özniteliğini aşağıdakileri yaparak alabilirsiniz:

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

Buradan ve buradan türetilmiştir .


9
Soru PhoneGap ile ilgili değildi. Cevabınız sadece insanları şaşırtabilir.
likebobby

8
@BobbyJ Sorunun, başlığın veya etiketlerin hiçbir yerinde, sorunun yerel bir uygulama hakkında olduğunu belirtmez. Bu, cevabı ararken Google'da ortaya çıkan şeydi ve beni birkaç saat kurtaracaktı.
Sean Hall

Teşekkürler Hall72215. Bundan memnun olurum ... eğer kendi sürüm numaranızı almanın başka bir yolu yoksa? Mümkünse bir eklentiden kaçınmayı tercih ederim!
Magnus Smith

@MagnusSmith PhoneGap / Cordova tarafından yerleşik işlevlerine eklenmediyse değil.
Sean Hall

Bu örnekte, uygulama oluşturmak için üçüncü taraf çözümlerini kullanmanın ne kadar aptalca olduğunu görebilirsiniz. Kendinizi sıfırdan yazdığınızda, kodlamak için sadece birkaç satır vardı.
Codebeat

19

Kotlin Tek Gömlekleri

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

BuildConfigSınıfınıza aktardığınızdan emin olun


13

Xamarin kullanıcıları için, sürüm adını ve kodunu almak için bu kodu kullanın

1) Sürüm Adı:

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

2) Sürüm Kodu:

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

12

Eğer xml üzerinde kullanmak istiyorsanız, gradle dosyanıza aşağıdaki satırı ekleyin:

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

Ve sonra xml'nizde şu şekilde kullanın:

<TextView
        android:gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/versionName" />

Benim xml hata alıyorum: '@ string / versionName' sembolü
çözülemiyor

12

Hayır, AndroidManifest.xml ile hiçbir şey yapmanıza gerek yok

Temel olarak, uygulamanızın sürüm adı ve uygulama seviyesi derecelendirme dosyası içindeki sürüm kodu , defaultConfig etiketi altında :

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

Not: Play Store'da uygulama yüklemek istediğinizde sürüm adı olarak herhangi bir ad verebilir, ancak bu uygulama zaten play store'da ise sürüm kodunun mevcut sürüm kodundan farklı olması gerekir.

Uygulamanızın herhangi bir yerinden sürüm kodunu ve sürüm adını almak için aşağıdaki kod snippet'ini kullanmanız yeterlidir :

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'de kullanımdan kaldırıldı. Dokümanlarda belirtildiği gibi bunun yerine longVersionCode kullanın; developer.android.com/reference/android/content/pm/…
Dan Abnormal

11

Api 28 için PackageInfo.versionCode kullanımdan kaldırılmıştır, bu nedenle aşağıdaki kodu kullanın:

    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

Her zaman try catchblokla yapın:

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

Sürüm kodunu alma yöntemi:

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
Daha iyi yöntem - BuildConfig.VERSION_CODE
Jaydev

8

Bu tercih sınıf kullanarak çözme var.

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

Almak için bazı yolları vardır versionCodeve versionNameprogramlı.

  1. Sürümü buradan edinin PackageManager. Çoğu durumda bu en iyi yoldur.
try {
    String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
    int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
  1. Oluşturulandan alın BuildConfig.java. Ancak, bu değerlere kitaplıkta erişirseniz, bu kitaplığı kullanan uygulamalara değil, kitaplık sürümünü döndüreceğine dikkat edin. Bu yüzden sadece kütüphane dışı projelerde kullanın!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

Kütüphane projesinde ikinci yolu kullanmak dışında bazı detaylar vardır. Yeni android gradle eklentisinde (3.0.0+) bazı işlevler kaldırıldı . Yani, şimdilik, yani farklı tatlar için farklı sürümü ayarlamak doğru çalışmıyor.

Yanlış yol:

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
}

Kod yukarıdaki doğru değerleri ayarlayacaktır BuildConfigancak gelen PackageManagerAlacağınız 0ve nulliçeri ayarlanan sürümü olmasaydı defaultyapılandırması. Böylece uygulamanızın 0cihazda sürüm kodu olacaktır .

Çıktı apkdosyası için manuel olarak ayarlanmış bir geçici çözüm sürümü vardır :

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

Bu kod yukarıda parçalar halinde belirtilmiştir, ancak burada yine hepsi dahil edilmiştir. Bir "NameNotFoundException" atabileceği için bir try / catch bloğu gerekir.

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

Umarım bu yoldaki birisi için işleri kolaylaştırır. :)


5

Ancak uygulamanın kullanıcı arayüzü için BuildConfig bilgisine ihtiyaç duymayan biri, bu bilgileri bir CI iş yapılandırması veya benim gibi başkalarını ayarlamak için kullanmak ister.

Projenizi başarıyla oluşturduğunuz sürece proje dizininizin altında otomatik olarak oluşturulan bir BuildConfig.java dosyası vardır.

{WORKSPACE} / build / üretilen / kaynak / buildConfig / {ayıklama | salım} / {PAKETİ} /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";
}

İhtiyacınız olan bilgileri python betiği veya diğer araçlarla bölün. İşte bir örnek:

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)

Lütfen sınırlı İngilizce yeteneğimi affedin, ancak umarım bu yardımcı olur.


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

    }

  }
}

Merhaba, @donmj. Android cihaz için un resmi kök kullanıyorsanız. Şey, ihtiyacın olacak. Bu benim yaklaşımım.
Durul Dalkanat

Yardımınız için teşekkürler @Durul Dalkanat :).
donmj

4

bunu dene:

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

3

İlk:

import android.content.pm.PackageManager.NameNotFoundException;

ve sonra bunu kullanın:

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

1
hiçbir bedenin bunun için zamanı yoktur.
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

İç Parça kullanımı için örnek.

        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

Cevabınızı göndermeden önce diğer cevaplara bakmalısınız. Örneğin bağlam için eğer fragment içinde iseniz getActivity.getApplicationContext yapıyorsunuz sonra anlayabiliyorum ama faaliyette iseniz getActivity
Sahil

Benim durumumda bunu Fragment için yaptım. Kod onCreate içeride kullanılır
Sapphire91140

3

Kotlin örneği:

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

Teşekkür etmeyin :-)


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

Sadece sürüm kodunu almak ve uygulamanın güncellenip güncellenmediğini kontrol etmek zorunda olduğum için, evet ise, güncellenen bir tane almak için oyun mağazasını başlatmak zorunda kaldım. Ben böyle yaptım.

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

}

Sonra bir util sınıfı oluşturarak paylaşılan tercihi kullanarak sürüm kodunu kaydetti.

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'de olduğu gibi: API 28 "versionCode" kullanımdan kaldırıldı, böylece "longVersionCode"

Kotlin'de örnek kod

  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

Derleme sistemleri output.jsoniçin kullanışlıdır: apk'nizle oluşturulan ve versionName ve versionCode dahil olmak üzere oluşturulan her APK için bir dizi bilgi içeren bir dosya vardır .

Örneğin

[
    {
        "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": {}
    }
]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.