Bagaimana cara mendapatkan nomor versi build / versi aplikasi Android Anda?

1288

Saya perlu mencari cara untuk mendapatkan atau membuat nomor build untuk aplikasi Android saya. Saya perlu nomor build untuk ditampilkan di UI.

Apakah saya harus melakukan sesuatu dengan AndroidManifest.xml?

Fahad Ali Shaikh
sumber
2
Tidak yakin, tapi saya pikir Anda bisa mendapatkannya dengan mem-parsing file AndroidManifest.xml.
Sunit Kumar Gupta
Untuk mendapatkan kode versi, gunakan int versionCode = BuildConfig.VERSION_CODE;dan untuk mendapatkan nama versiString versionName = BuildConfig.VERSION_NAME;
Lukas

Jawaban:

2041

Menggunakan:

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

Dan Anda bisa mendapatkan kode versi dengan menggunakan ini

int verCode = pInfo.versionCode;
plus-
sumber
52
@Felix Anda tidak dapat memanggil getPackageManager () di luar konteks, jadi getApplicationContext () (atau lewat konteks) mungkin diperlukan.
Sver
2
bagaimana jika Anda memerlukan nomor ini di dalam beberapa metode statis di mana Anda tidak dapat melewati konteksnya? desain yang buruk di pihak saya?
Gubatron
35
Dan jangan lupa try... catch..kapangetPackageInfo()
anticafe
4
@Ubatron jawaban saya di bawah ini memungkinkan untuk mengambil nilai-nilai ini secara statis.
Sam Dozor
25
Jika Anda hanya ingin mendapatkan versi aplikasi, ini adalah dua yang dikompilasi. Anda harus menggunakan BuildConfig.VERSION_**seperti yang disarankan di sini .
Timo Bähr
1920

Jika Anda menggunakan plugin Gradle / Android Studio, pada versi 0.7.0 , kode versi dan nama versi tersedia secara statis di BuildConfig. Pastikan Anda mengimpor paket aplikasi Anda , dan bukan yang lain BuildConfig:

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

Tidak diperlukan objek Konteks!

Pastikan juga untuk menentukannya di build.gradlefile Anda, bukan AndroidManifest.xml.

defaultConfig {
    versionCode 1
    versionName "1.0"
}
Sam Dozor
sumber
178
Ini sebenarnya jauh lebih baik daripada semua konteks dan manajer paket, Terima kasih.
superjugy
16
Sebenarnya ini adalah solusi terbaik setelah Android Studio diluncurkan !!! +1 dari pihak saya
Dhruvil Patel
15
Itu tidak terlalu bisa diandalkan. Nama versi muncul sebagai string kosong sebagian besar waktu.
Binoy Babu
20
@BinoyBabu seharusnya tidak pernah muncul sebagai string kosong jika Anda telah menentukan versionNameaplikasi Anda di build.gradlefile Anda .
Sam Dozor
39
Anda harus mengimpor paket yang benar agar ini berfungsi:import com.yourapppackage.android.BuildConfig
Eric B.
438

Versi sedikit lebih pendek jika Anda hanya ingin nama versi.

String versionName = context.getPackageManager()
    .getPackageInfo(context.getPackageName(), 0).versionName;
scottyab
sumber
81
Luar biasa. Ini mungkin harus dikelilingi dengan try / catch untuk NameNotFoundException.
IgorGanapolsky
6
+1 Saya telah menerapkan solusi Anda yang sangat bagus! Namun, solusi ini harus dikelilingi oleh coba dan tangkap seperti kata Igor DAN itu adalah praktik yang baik (misalnya untuk debugging) untuk menempatkan setiap pemanggilan metode pada baris yang terpisah alih-alih memanggil context.methodName (). SubMethod (). SubSetMethod () dll pada satu baris. Karena itu saya memberikan solusi bersih di bawah ini
Michael
1
Itu solusi yang tepat, terima kasih;) Tapi, seperti yang disarankan oleh @IgorGanapolsky, perlu dikelilingi dengan coba / tangkap :)
andrea.rinaldi
2
bagi mereka yang menggunakan Gradle - ada solusi yang lebih sederhana. Lihat jawaban saya di bawah ini.
Sam Dozor
1
@ Erwin saya dengan sepenuh hati tidak setuju dengan gagasan menggunakan Pengecualian generik untuk menangkap hal-hal seperti ini. Pengecualian yang lebih baik menunjukkan pemahaman pengembang tentang kemungkinan kesalahan.
IgorGanapolsky
174

Ada dua bagian yang Anda butuhkan: android: versionCode android: versionName

versionCode adalah angka, dan setiap versi aplikasi yang Anda kirim ke Pasar harus memiliki angka yang lebih tinggi daripada yang terakhir.

VersionName adalah string, dan bisa berupa apa pun yang Anda inginkan. Di sinilah Anda mendefinisikan aplikasi Anda sebagai "1.0" atau "2.5" atau "2 Alpha EXTREME!" atau terserah.

Contoh:

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
sumber
6
Deskripsi resmi Android tentang android:versionCodedan android:versionNamedapat ditemukan di sini: developer.android.com/tools/publishing/…
Jeffro
2
ini dalam hal ini adalah Konteks. Yaitu Kegiatan, Layanan .etc
peterchaula
3
ketika Anda menempelkan beberapa kode sampel berguna untuk menjelaskan arti dari parameter .... althoug semua orang dapat memahami apa yang this.getPackageName()mewakili 0Anda hanya meludah tidak memiliki petunjuk tentang artinya
Rafael Lima
Android Studio mengklaim versionCode sudah tidak digunakan lagi
Roman Gherta
1
@RomanGherta Mulai dari API 28. Jika Anda menulis kode menggunakan sesuatu yang kurang (atau 8 tahun yang lalu ketika jawaban ini ditulis) Anda masih harus melanjutkan. Jawaban lain di sini memiliki metode yang diperbarui.
Merkidemis
146

Menggunakan Gradle dan BuildConfig

Dapatkan VERSION_NAME dari BuildConfig

BuildConfig.VERSION_NAME

Yap, mudah sekarang.

Apakah Ini Mengembalikan String Kosong untuk VERSION_NAME?

Jika Anda mendapatkan string kosong untuk BuildConfig.VERSION_NAMEkemudian baca terus.

Saya terus mendapatkan string kosong BuildConfig.VERSION_NAMEkarena saya tidak mengatur versionNamefile build Grade saya (saya bermigrasi dari ANT ke Gradle). Jadi, berikut adalah petunjuk untuk memastikan Anda mengatur VERSION_NAMEvia 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}"
  }

}

Catatan: Ini dari Jake Wharton yang ahli .

Menghapus versionNamedan versionCodedariAndroidManifest.xml

Dan karena Anda telah mengatur versionNamedan versionCodedalam build.gradlefile sekarang, Anda juga dapat menghapusnya dari AndroidManifest.xmlfile Anda , jika ada di sana.

Joshua Pinter
sumber
5
Ini berfungsi dengan baik selama Anda mengakses BuildConfig dari proyek aplikasi, bukan perpustakaan yang digunakan dalam proyek aplikasi. Jika tidak, Anda akan mendapatkan BuildConfig untuk proyek perpustakaan, bukan aplikasi.
John Cummings
@JohnCummings Menarik ... tidak memikirkan itu.
Joshua Pinter
Tidak bekerja sama sekali versionName "1.2",, dan BuildConfig.VERSION_NAMEkembali empty. API> 21
Sojtin
Sebagai tindak lanjut, kami benar-benar berhenti menggunakan metode ini hanya demi bilangan bulat statis dan String statis untuk versionCodedan versionName, masing-masing. Hanya karena beberapa alat seperti Code Push berusaha untuk mendapatkan nomor versi Anda dengan mem-parsing build.gradlefile Anda dan mereka tidak dapat memenuhi nilai dinamis.
Joshua Pinter
@JoshuaPinter PackageManager benar-benar adalah opsi paling aman. Jika Anda menggunakan penggantian kode versi untuk pemisahan, konstanta BuildConfig masih memiliki nilai asli (walaupun diberi rasa).
Eugen Pechanec
54

Berikut ini adalah solusi bersih , berdasarkan solusi scottyab (diedit oleh Xavi). Ini menunjukkan cara mendapatkan konteks terlebih dahulu, jika tidak disediakan oleh metode Anda. Selain itu menggunakan beberapa baris alih-alih memanggil beberapa metode per baris. Ini membuatnya lebih mudah ketika Anda harus men-debug aplikasi Anda.

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

Sekarang setelah Anda menerima nama versi dalam String myVersionName, Anda dapat mengaturnya ke TextView atau apa pun yang Anda suka ..

// set version name to a TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);
Michael
sumber
Apakah Anda berpikir bahwa NNFE dapat benar-benar dilemparkan? Akan aneh untuk tidak menemukan aplikasi yang sedang berjalan di manajer paket :)
TWiStErRob
Saya bersama Anda bahwa ini mungkin aneh, tapi ini pengecualian default metode ini - lihat API : katanya Throws PackageManager.NameNotFoundException if a package with the given name can not be found on the system.. Namun, saya tidak bisa membayangkan skenario untuk itu!
Michael
38

Untuk mendapatkan versi aplikasi atau kode bangunan yang digunakan untuk mengidentifikasi apk dengan kode versinya. Kode versi digunakan untuk mendeteksi konfigurasi build aktual pada saat pembaruan, penerbitan, dll.

int versionCode = BuildConfig.VERSION_CODE;

Nama versi digunakan untuk menunjukkan kepada pengguna atau pengembang dari urutan pengembangan. Anda dapat menambahkan segala jenis nama versi yang Anda inginkan

String versionName = BuildConfig.VERSION_NAME;
Rohit Patil
sumber
34

Gunakan kelas BuildConfig

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

build.gradle (aplikasi)

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

Jika Anda menggunakan PhoneGap, buatlah plugin PhoneGap khusus:

Buat kelas baru di paket aplikasi Anda:

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

Di plugins.xml, tambahkan baris berikut:

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

Dalam acara deviceready Anda , tambahkan kode berikut:

var PackageManagerPlugin = function() {

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

Kemudian, Anda bisa mendapatkan atribut versiName dengan melakukan:

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

Berasal dari sini dan sini .

Sean Hall
sumber
9
Pertanyaannya bukan tentang PhoneGap. Jawaban Anda mungkin membingungkan orang.
likebobby
8
@ BobbyJ Tidak ada dalam pertanyaan, judul, atau tag yang menentukan bahwa pertanyaannya adalah tentang aplikasi asli. Inilah yang muncul di google ketika saya mencari jawabannya, dan akan menyelamatkan saya beberapa jam.
Sean Hall
Terima kasih Hall72215. Saya akan senang dengan ini ... jika benar-benar tidak ada cara lain untuk mendapatkan nomor versi Anda sendiri? Saya lebih suka menghindari plugin jika memungkinkan!
Magnus Smith
@MagnusSmith Tidak kecuali PhoneGap / Cordova telah menambahkannya ke fungsi bawaan mereka.
Sean Hall
Dalam contoh ini Anda dapat melihat betapa konyolnya menggunakan solusi pihak ketiga untuk membuat aplikasi. Ketika Anda menulis sendiri dari awal, itu hanya beberapa baris ke kode.
Codebeat
19

Kotlin satu garis

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

Pastikan untuk mengimpor BuildConfigke kelas Anda

Gastón Saillén
sumber
13

Untuk pengguna xamarin, gunakan kode ini untuk mendapatkan nama versi dan kode

1) Nama Versi:

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

2) Kode Versi:

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

Jika Anda ingin menggunakannya di xml kemudian tambahkan baris di bawah ini pada file gradle Anda:

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

Dan kemudian gunakan di xml Anda seperti ini:

<TextView
        android:gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/versionName" />
Irfan Raza
sumber
Saya mendapatkan kesalahan xml saya: Tidak dapat menyelesaikan simbol '@ string / versionName'
RJB
12

Tidak, Anda tidak perlu melakukan apa pun dengan AndroidManifest.xml

Pada dasarnya nama versi & versi kode di dalam aplikasi Anda tingkat aplikasi Gradle berkas, di bawah defaultConfig tag:

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

Catatan: Ketika Anda ingin mengunggah aplikasi di playstore dapat memberikan nama apa pun sebagai nama versi tetapi kode versi harus berbeda dari kode versi saat ini jika aplikasi ini sudah ada di play store.

Cukup gunakan cuplikan kode berikut untuk mendapatkan kode versi & nama versi dari mana saja di aplikasi Anda:

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
sumber
1
versionCode sudah tidak digunakan lagi di API 28. Seperti yang dinyatakan dalam dokumen, gunakan longVersionCode sebagai gantinya; developer.android.com/reference/android/content/pm/…
Dan Abnormal
11

untuk Api 28 PackageInfo.versionCode sudah tidak digunakan lagi, jadi gunakan kode ini di bawah ini:

    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
sumber
9

Selalu lakukan dengan try catchblokir:

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
sumber
9

Berikut adalah metode untuk mendapatkan kode versi:

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
sumber
3
Metode yang lebih baik - BuildConfig.VERSION_CODE
Jaydev
8

Saya telah MEMECAHKAN ini dengan menggunakan kelas Preferensi.

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
sumber
8

Ada beberapa cara untuk mendapatkan versionCodedan secara versionNameterprogram.

  1. Dapatkan versi dari PackageManager. Ini adalah cara terbaik untuk sebagian besar kasus.
try {
    String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
    int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
  1. Dapatkan dari yang dihasilkan BuildConfig.java. Tetapi perhatikan, bahwa jika Anda akan mengakses nilai-nilai ini di perpustakaan itu akan mengembalikan versi perpustakaan, bukan aplikasi satu, yang menggunakan perpustakaan ini. Jadi gunakan hanya dalam proyek non-perpustakaan!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

Ada beberapa detail, kecuali menggunakan cara kedua dalam proyek perpustakaan. Di plugin gradle android baru (3.0.0+) beberapa fungsi dihapus . Jadi, untuk saat ini, yaitu mengatur versi yang berbeda untuk rasa yang berbeda tidak berfungsi dengan benar.

Cara yang salah:

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
}

Kode di atas akan menetapkan nilai dengan benar BuildConfig, tetapi dari PackageManagerAnda akan menerima 0dan nulljika Anda tidak menetapkan versi dalam defaultkonfigurasi. Jadi aplikasi Anda akan memilikinya0 kode versi di perangkat.

Ada solusi - set versi untuk apkfile output secara manual:

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
sumber
6

Kode ini disebutkan di atas dalam beberapa bagian tetapi di sini sekali lagi semua termasuk. Anda memerlukan blok coba / tangkap karena mungkin melempar "NameNotFoundException".

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

Saya harap ini menyederhanakan hal-hal untuk seseorang di jalan. :)

Jeff. H
sumber
5

Seseorang yang tidak memerlukan informasi BuildConfig untuk UI aplikasi namun ingin menggunakan info ini untuk mengatur konfigurasi pekerjaan CI atau orang lain, seperti saya.

Ada file yang dibuat secara otomatis, BuildConfig.java, di bawah direktori proyek Anda selama Anda berhasil membangun proyek.

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

Membagi informasi yang Anda butuhkan dengan skrip python atau alat lain. Ini sebuah contoh:

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)

Maafkan kemampuan bahasa Inggris saya yang terbatas, tetapi harap ini membantu.

JasonChiu
sumber
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
sumber
Hai, @donmj. Jika Anda menggunakan root resmi untuk perangkat Android. Saya kira, Anda akan perlu. Ini pendekatan saya.
Durul Dalkanat
Terima kasih atas bantuan @Durul Dalkanat :).
donmj
4

coba yang ini:

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

Pertama:

import android.content.pm.PackageManager.NameNotFoundException;

dan kemudian gunakan ini:

PackageInfo pInfo = null;
try {
     pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
     e.printStackTrace();
            }
String versionName = pInfo.versionName;
meduvigo
sumber
1
"Tidak ada orang yang punya waktu untuk itu.
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
sumber
3

Contoh untuk penggunaan Fragmen di dalam.

        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
Sapphire91140
sumber
Anda harus melihat jawaban lain sebelum memposting jawaban Anda. misalnya untuk konteks yang Anda lakukan getActivity.getApplicationContext jika Anda berada dalam fragmen maka saya bisa mengerti tetapi jika Anda sedang dalam kegiatan saya tidak berpikir Anda perlu memanggil getActivity
Sahil Manchanda
Dalam kasus saya, saya membuatnya untuk Fragment. Kode digunakan di dalam onCreate
Sapphire91140
3

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

Jangan berterima kasih :-)

Alexander Gavriliuk
sumber
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
sumber
2

Karena saya harus mendapatkan hanya kode versi dan memeriksa apakah aplikasi diperbarui atau tidak, jika ya, saya harus meluncurkan playstore untuk mendapatkan yang diperbarui. Saya melakukan ini.

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

}

Kemudian saya menyimpan kode versi menggunakan preferensi bersama dengan membuat kelas 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
sumber
2

Seperti pada tahun 2020: API 28 "versionCode" sudah tidak digunakan lagi sehingga kita dapat menggunakan "longVersionCode"

Kode sampel dalam 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
sumber
0

Berguna untuk membangun sistem: ada file yang dibuat dengan apk yang dipanggil output.json yang berisi larik informasi untuk setiap APK yang dihasilkan, termasuk versionName dan versionCode.

misalnya

[
    {
        "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": {}
    }
]
Tom
sumber