Làm cách nào để lấy số bản dựng / phiên bản của ứng dụng Android của bạn?


1288

Tôi cần tìm ra cách lấy hoặc tạo số bản dựng cho ứng dụng Android của mình. Tôi cần số bản dựng để hiển thị trong UI.

Tôi có phải làm gì với AndroidManifest.xmlkhông?


2
Không chắc chắn, nhưng tôi nghĩ bạn có thể lấy nó bằng cách phân tích tệp AndroidManifest.xml.
Sunit Kumar Gupta


Để lấy mã phiên bản, hãy sử dụng int versionCode = BuildConfig.VERSION_CODE;và lấy tên phiên bảnString versionName = BuildConfig.VERSION_NAME;
Lukas

Câu trả lời:


2041

Sử dụng:

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

Và bạn có thể lấy mã phiên bản bằng cách sử dụng

int verCode = pInfo.versionCode;

52
@Felix bạn không thể gọi getPackageManager () bên ngoài ngữ cảnh, vì vậy getApplicationContext () (hoặc thông qua ngữ cảnh) có thể cần thiết.
Sver

2
Điều gì nếu bạn cần số này trong một số phương thức tĩnh mà bạn không thể vượt qua bối cảnh? thiết kế xấu về phía tôi?
Gubatron

35
Và đừng quên try... catch..khi nàogetPackageInfo()
anticafe

4
@Gubatron câu trả lời của tôi dưới đây cho phép lấy các giá trị này một cách tĩnh.
Sam Dozor

25
Nếu bạn chỉ muốn lấy phiên bản của ứng dụng thì đây là hai phiên bản. Bạn nên sử dụng BuildConfig.VERSION_**theo đề nghị ở đây .
Timo Bähr

1919

Nếu bạn đang sử dụng plugin Gradle / Android Studio, kể từ phiên bản 0.7.0 , mã phiên bản và tên phiên bản có sẵn trong tĩnh BuildConfig. Đảm bảo bạn nhập gói ứng dụng của mình chứ không phải gói khác BuildConfig:

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

Không có đối tượng bối cảnh cần thiết!

Cũng đảm bảo chỉ định chúng trong build.gradletệp của bạn thay vì AndroidManifest.xml.

defaultConfig {
    versionCode 1
    versionName "1.0"
}

178
Điều này thực sự tốt hơn rất nhiều so với tất cả các trình quản lý bối cảnh và gói, Cảm ơn bạn.
superjugy

16
Trên thực tế đây là giải pháp tốt nhất sau khi Android Studio được ra mắt !!! +1 từ phía tôi
Dhruvil Patel

15
Nó không đáng tin cậy lắm. Tên phiên bản xuất hiện dưới dạng một chuỗi trống hầu hết thời gian.
Binoy Babu

20
@BinoyBabu nó sẽ không bao giờ hiển thị dưới dạng một chuỗi trống nếu bạn đã chỉ định một versionNameứng dụng cho build.gradletệp của mình .
Sam Dozor

39
Bạn sẽ cần nhập gói chính xác để làm việc này:import com.yourapppackage.android.BuildConfig
Eric B.

438

Phiên bản ngắn hơn một chút nếu bạn chỉ muốn tên phiên bản.

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

81
Thông minh. Điều này có lẽ nên được bao quanh với thử / bắt cho NameNotFoundException.
IgorGanapolsky

6
+1 Tôi đã triển khai giải pháp của bạn rất hiệu quả! Tuy nhiên, giải pháp này nên được bao quanh bởi thử và bắt như Igor đã nói VÀ đó là một cách thực hành tốt (ví dụ để gỡ lỗi) để đặt mỗi lệnh gọi phương thức trên một dòng riêng thay vì gọi bối cảnh.methodName (). SubMethod (). AnotherSubMethod (), v.v. trên một dòng duy nhất. Do đó, tôi đã cung cấp một giải pháp sạch hơn bên dưới
Michael

1
Đó là giải pháp phù hợp, cảm ơn;) Nhưng, như được đề xuất bởi @IgorGanapolsky, nó cần được bao quanh với thử / bắt :)
andrea.rinaldi

2
Đối với những người sử dụng Gradle - có một giải pháp đơn giản hơn. Xem câu trả lời của tôi dưới đây.
Sam Dozor

1
@Erwinus Tôi hoàn toàn không đồng ý với khái niệm sử dụng Ngoại lệ chung để bắt những thứ như thế này. Các trường hợp ngoại lệ chi tiết hơn chứng tỏ sự hiểu biết của nhà phát triển về các lỗi có thể xảy ra.
IgorGanapolsky

174

Có hai phần bạn cần: android: versionCode android: versionName

versionCode là một số và mỗi phiên bản của ứng dụng bạn gửi tới Thị trường cần phải có số cao hơn số cuối cùng.

VersionName là một chuỗi và có thể là bất cứ điều gì bạn muốn. Đây là nơi bạn xác định ứng dụng của mình là "1.0" hoặc "2.5" hoặc "2 Alpha EXTREME!" hay bất cứ cái gì.

Thí dụ:

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
Mô tả chính thức của Android về android:versionCodeandroid:versionNamecó thể được tìm thấy ở đây: developer.android.com/tools/publishing/
Khăn

2
này trong trường hợp này là Context Hoạt động nghĩa là, Dịch vụ Vv
peterchaula

3
Khi bạn dán một số mã mẫu là hữu ích để giải thích ý nghĩa của các tham số .... althoug mọi người có thể hiểu những gì this.getPackageName()đại diện cho 0bạn vừa nhổ không có manh mối về ý nghĩa
Rafael Lima

Android Studio tuyên bố phiên bản

1
@RomanGherta Nó là API 28. Nếu bạn đang viết mã bằng cách sử dụng bất cứ điều gì ít hơn (hoặc 8 năm trước khi câu trả lời này được viết), bạn vẫn nên đi. Một câu trả lời khác ở đây có phương pháp cập nhật.
Merkidemis

146

Sử dụng Gradle và BuildConfig

Nhận VERSION_NAME từ BuildConfig

BuildConfig.VERSION_NAME

Đúng, bây giờ thì dễ rồi.

Có phải nó đang trả lại một chuỗi rỗng cho VERSION_NAME không?

Nếu bạn nhận được một chuỗi trống cho BuildConfig.VERSION_NAMEthì hãy đọc tiếp.

Tôi liên tục nhận được một chuỗi trống BuildConfig.VERSION_NAMEvì tôi đã không thiết lập versionNametệp xây dựng Lớp của mình (Tôi đã di chuyển từ ANT sang Gradle). Vì vậy, đây là hướng dẫn để đảm bảo bạn thiết lập VERSION_NAMEthông qua Gradle.

xây dựng. nâng cấp

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

}

Lưu ý: Đây là từ Jake Wharton thông thạo .

Loại bỏ versionNameversionCodetừAndroidManifest.xml

Và vì bạn đã thiết lập versionNameversionCodetrong build.gradletệp ngay bây giờ, bạn cũng có thể xóa chúng khỏi AndroidManifest.xmltệp của mình , nếu chúng ở đó.


5
Điều này hoạt động rất tốt miễn là bạn đang truy cập BuildConfig từ dự án ứng dụng, chứ không phải thư viện được sử dụng trong dự án ứng dụng. Nếu không, bạn sẽ nhận được BuildConfig cho dự án thư viện, không phải ứng dụng.
John Cummings

@JohnCummings Thú vị ... không nghĩ về điều đó.
Joshua Pinter

Không làm việc gì cả versionName "1.2", và BuildConfig.VERSION_NAMEtrở về empty. API> 21
Sojtin

Để theo dõi, chúng tôi thực sự đã ngừng sử dụng phương pháp này để ủng hộ chỉ một số nguyên tĩnh và Chuỗi tĩnh cho versionCodeversionName, tương ứng. Chỉ vì một số công cụ như Code Push cố lấy số phiên bản của bạn bằng cách phân tích build.gradletệp của bạn và chúng không thể chứa đầy một giá trị động.
Joshua Pinter

@JoshuaPinter GóiManager thực sự là lựa chọn an toàn nhất. Nếu bạn sử dụng ghi đè mã phiên bản để phân tách thì hằng số BuildConfig vẫn giữ giá trị ban đầu (mặc dù có hương vị).
Eugen Pechanec

54

Đây là một giải pháp sạch , dựa trên giải pháp của scottyab (được chỉnh sửa bởi Xavi). Nó chỉ ra cách lấy bối cảnh trước, nếu nó không được cung cấp bởi phương thức của bạn. Hơn nữa, nó sử dụng nhiều dòng thay vì gọi nhiều phương thức trên mỗi dòng. Điều này làm cho nó dễ dàng hơn khi bạn phải gỡ lỗi ứng dụng của bạn.

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

Bây giờ bạn đã nhận được tên phiên bản trong Chuỗi myVersionName, bạn có thể đặt nó thành TextView hoặc bất cứ thứ gì bạn thích ..

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

Bạn có nghĩ rằng NNFE có thể thực sự bị ném? Sẽ thật kỳ lạ khi không tìm thấy một ứng dụng đang chạy trong trình quản lý gói :)
TWiStErRob

Tôi với bạn rằng nó có thể kỳ lạ, nhưng đó là ngoại lệ mặc định của phương pháp này - xem API : nó nói Throws PackageManager.NameNotFoundException if a package with the given name can not be found on the system.. Tuy nhiên, tôi không thể tưởng tượng ra một kịch bản cho điều đó!
Michael

38

Để lấy phiên bản ứng dụng hoặc mã xây dựng được sử dụng để xác định apk theo mã phiên bản của nó. Mã phiên bản được sử dụng để phát hiện cấu hình bản dựng thực tế tại thời điểm cập nhật, xuất bản, v.v.

int versionCode = BuildConfig.VERSION_CODE;

Tên phiên bản được sử dụng để hiển thị cho người dùng hoặc nhà phát triển trình tự phát triển. Bạn có thể thêm bất kỳ loại tên phiên bản nào bạn muốn

String versionName = BuildConfig.VERSION_NAME;

34

Sử dụng lớp BuildConfig

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

build.gradle (ứng dụng)

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

23

Nếu bạn đang sử dụng PhoneGap, thì hãy tạo plugin PhoneGap tùy chỉnh:

Tạo một lớp mới trong gói ứng dụng của bạn:

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

Trong plugin, thêm dòng sau:

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

Trong sự kiện đẹp mắt của bạn , hãy thêm đoạn mã sau:

var PackageManagerPlugin = function() {

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

Sau đó, bạn có thể lấy thuộc tính versionName bằng cách thực hiện:

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

Bắt nguồn từ đâyđây .


9
Câu hỏi không phải là về PhoneGap. Câu trả lời của bạn có thể chỉ khiến mọi người nhầm lẫn.
likebobby

8
@BulkJ Không ở đâu trong câu hỏi, tiêu đề hoặc thẻ, nó chỉ định rằng câu hỏi là về một ứng dụng gốc. Đây là những gì xuất hiện trên google khi tôi đang tìm kiếm câu trả lời và sẽ giúp tôi tiết kiệm được vài giờ.
Sean Hall

Cảm ơn Hội trường72215. Tôi sẽ rất vui vì điều này ... nếu thực sự không có cách nào khác để có được số phiên bản của riêng bạn? Tôi muốn tránh một plugin nếu có thể!
Magnus Smith

@MagnusSmith Không trừ khi PhoneGap / Cordova đã thêm nó vào các chức năng tích hợp của họ.
Sean Hall

Trong ví dụ này, bạn có thể thấy thật ngớ ngẩn khi sử dụng các giải pháp của bên thứ ba để tạo ứng dụng. Khi bạn tự viết nó từ đầu, nó chỉ là một vài dòng mã.
Codebeat

19

Một lớp lót của Kotlin

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

Đảm bảo nhập BuildConfigvào lớp của bạn


13

Đối với người dùng xamarin, sử dụng mã này để lấy tên phiên bản và mã

1) Tên phiên bản:

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

2) Mã phiên bản:

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

12

Nếu bạn muốn sử dụng nó trên xml, hãy thêm dòng dưới đây vào tệp gradle của bạn:

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

Và sau đó sử dụng nó trên xml của bạn như thế này:

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

Tôi đang gặp lỗi trong xml của mình: Không thể giải quyết biểu tượng '@ string / versionName'
RJB

12

Không, bạn không cần phải làm gì với AndroidManifest.xml

Về cơ bản tên phiên bản và mã phiên bản ứng dụng của bạn bên trong tệp phân loại cấp ứng dụng , trong thẻ defaultConfig :

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

Lưu ý: Khi bạn muốn tải lên ứng dụng trong playstore có thể đặt bất kỳ tên nào dưới dạng tên phiên bản nhưng mã phiên bản phải khác với mã phiên bản hiện tại nếu ứng dụng này đã có trong cửa hàng play.

Chỉ cần sử dụng đoạn mã sau để lấy phiên bản & tên phiên bản từ bất kỳ đâu trong ứng dụng của bạn:

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 không được dùng trong API 28. Như đã nêu trong các tài liệu, thay vào đó hãy sử dụng longVersionCode; developer.android.com/reference/android/content/pm/
Mạnh

11

Đối với Api 28, GóiInfo.versionCode không được dùng nữa, vì vậy hãy sử dụng mã dưới đây:

    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

Luôn luôn làm điều đó với try catchkhối:

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

Đây là phương pháp để lấy mã phiên bản:

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
Phương pháp tốt hơn - BuildConfig.VERSION_CODE
Jaydev

8

Tôi đã GIẢI QUYẾT điều này bằng cách sử dụng lớp Ưu tiên.

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

Có một số cách để có được versionCodeversionNamelập trình.

  1. Nhận phiên bản từ PackageManager. Đây là cách tốt nhất cho hầu hết các trường hợp.
try {
    String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
    int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
  1. Lấy nó từ tạo ra BuildConfig.java. Nhưng lưu ý rằng, nếu bạn truy cập các giá trị này trong thư viện, nó sẽ trả về phiên bản thư viện, không phải ứng dụng một, sử dụng thư viện này. Vì vậy, chỉ sử dụng trong các dự án phi thư viện!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

Có một số chi tiết, ngoại trừ việc sử dụng cách thứ hai trong dự án thư viện. Trong plugin Android gradle mới (3.0.0+), một số chức năng đã bị xóa . Vì vậy, hiện tại, tức là cài đặt phiên bản khác nhau cho các hương vị khác nhau không hoạt động chính xác.

Cách không chính xác:

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
}

Mã ở trên sẽ đặt chính xác các giá trị trong BuildConfig, nhưng từ PackageManagerbạn sẽ nhận được 0nullnếu bạn không đặt phiên bản trong defaultcấu hình. Vì vậy, ứng dụng của bạn sẽ có 0mã phiên bản trên thiết bị.

Có một cách giải quyết - thiết lập phiên bản cho apktệp đầu ra theo cách thủ công:

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

Mã này đã được đề cập ở trên thành từng mảnh nhưng ở đây nó lại được bao gồm tất cả. Bạn cần một khối thử / bắt vì nó có thể ném "NameNotFoundException".

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

Tôi hy vọng điều này đơn giản hóa mọi thứ cho một người nào đó trên đường. :)


5

Một số người không cần thông tin BuildConfig cho giao diện người dùng của ứng dụng tuy nhiên muốn sử dụng những thông tin này để đặt cấu hình công việc CI hoặc những người khác, như tôi.

Có một tệp được tạo tự động, BuildConfig.java, trong thư mục dự án của bạn miễn là bạn xây dựng dự án của mình thành công.

{WORKSPACE} / build / created / source / buildConfig / {debug | phát hành} / {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";
}

Phân chia thông tin bạn cần bằng tập lệnh python hoặc các công cụ khác. Đây là một ví dụ:

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)

Xin thứ lỗi khả năng tiếng Anh hạn chế của tôi, nhưng hy vọng điều này sẽ giúp.


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

    }

  }
}

Xin chào, @donmj. Nếu bạn đang sử dụng root chưa chính thức cho thiết bị Android. Tôi điều, bạn sẽ cần. Đây là cách tiếp cận của tôi.
Durul Dalkanat

Cảm ơn sự giúp đỡ @Durul Dalkanat :).
donmj

4

Hãy thử cái này:

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

3

Đầu tiên:

import android.content.pm.PackageManager.NameNotFoundException;

và sau đó sử dụng:

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

1
Không có cơ thể có thời gian cho điều đó.
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

Ví dụ cho việc sử dụng Fragment bên trong.

        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

Bạn nên xem các câu trả lời khác trước khi đăng câu trả lời của bạn. ví dụ: đối với bối cảnh bạn đang thực hiện getActivity.getApplicationContext nếu bạn đang ở trong phân đoạn thì tôi có thể hiểu nhưng nếu bạn đang hoạt động tôi không nghĩ bạn sẽ cần gọi getActivity
Sahil Manchanda

Trong trường hợp của tôi, tôi đã làm điều đó cho Fragment. Mã được sử dụng bên trong onCreate
Sapphire91140

3

Ví dụ về 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())
    }
}

Đừng cảm ơn :-)


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

Vì tôi chỉ phải lấy mã phiên bản và kiểm tra xem ứng dụng có được cập nhật hay không, nếu có, tôi phải khởi chạy playstore để được cập nhật. Tôi đã làm theo cách này.

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

}

Sau đó, tôi đã lưu mã phiên bản bằng cách sử dụng tùy chọn chia sẻ bằng cách tạo một lớp tiện dụng.

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

Như năm 2020: API 28 "versionCode" không được dùng nữa nên chúng tôi có thể sử dụng "longVersionCode"

Mã mẫu trong 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
        }

0

Hữu ích cho các hệ thống xây dựng: có một tệp được tạo bằng apk của bạn được gọi output.jsonchứa một mảng thông tin cho mỗi APK được tạo, bao gồm versionName và versionCode.

ví dụ

[
    {
        "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": {}
    }
]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.