วิธีรับหมายเลขบิลด์ / เวอร์ชั่นของแอปพลิเคชัน Android ของคุณ


1287

ฉันต้องการทราบวิธีรับหรือสร้างหมายเลขสำหรับแอปพลิเคชัน Android ของฉัน ฉันต้องการหมายเลขบิลด์เพื่อแสดงใน UI

ฉันต้องทำอะไรด้วยAndroidManifest.xmlหรือไม่


2
ไม่แน่ใจ แต่ฉันคิดว่าคุณสามารถรับได้โดยการแยกวิเคราะห์ไฟล์ AndroidManifest.xml
Sunit Kumar Gupta


ในการรับรหัสเวอร์ชันให้ใช้int versionCode = BuildConfig.VERSION_CODE;และเพื่อรับชื่อรุ่นString versionName = BuildConfig.VERSION_NAME;
Lukas

คำตอบ:


2040

ใช้:

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

และคุณสามารถรับรหัสรุ่นได้โดยใช้สิ่งนี้

int verCode = pInfo.versionCode;

52
@Felix คุณไม่สามารถเรียก getPackageManager () นอกบริบทได้ดังนั้นจึงจำเป็นต้องใช้ getApplicationContext () (หรือบริบทที่ผ่าน)
Sver

2
ถ้าคุณต้องการตัวเลขนี้ในวิธีคงที่ที่คุณไม่สามารถผ่านบริบทได้ การออกแบบที่ไม่ดีในส่วนของฉัน?
Gubatron

35
และอย่าลืมว่าtry... catch..เมื่อใดgetPackageInfo()
anticafe

4
@Gatatron คำตอบของฉันด้านล่างช่วยให้สามารถดึงค่าเหล่านี้แบบคงที่
Sam Dozor

25
หากคุณต้องการรับเวอร์ชันของแอปพลิเคชั่นนี่เป็นการคอมไพล์สองรายการ คุณควรใช้BuildConfig.VERSION_**เป็นข้อเสนอแนะที่นี่
Timo Bähr

1915

หากคุณกำลังใช้ปลั๊กอิน Gradle / Android สตูดิโอเป็นของรุ่น 0.7.0BuildConfigรหัสรุ่นและชื่อรุ่นที่มีอยู่ในแบบคงที่ ตรวจสอบให้แน่ใจว่าคุณนำเข้าแพคเกจแอปและไม่ใช่BuildConfig:

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

ไม่ต้องใช้วัตถุบริบท!

นอกจากนี้ยังให้แน่ใจว่าจะระบุไว้ในคุณไฟล์แทนbuild.gradleAndroidManifest.xml

defaultConfig {
    versionCode 1
    versionName "1.0"
}

177
อันนี้จริง ๆ แล้วดีกว่าบริบทและผู้จัดการแพคเกจขอบคุณมาก
superjugy

16
จริงๆแล้วนี่คือทางออกที่ดีที่สุดหลังจาก Android Studio เปิดตัว !!! +1 จากด้านของฉัน
Dhruvil Patel

15
มันไม่น่าเชื่อถือมาก ชื่อรุ่นจะแสดงเป็นสตริงว่างส่วนใหญ่
Binoy Babu

20
@BinoyBabu ไม่ควรแสดงเป็นสตริงว่างเปล่าหากคุณได้ระบุversionNameแอพสำหรับbuild.gradleไฟล์ของคุณ
Sam Dozor

39
คุณจะต้องนำเข้าแพคเกจที่ถูกต้องเพื่อใช้งาน:import com.yourapppackage.android.BuildConfig
Eric B.

437

รุ่นที่สั้นกว่าเล็กน้อยหากคุณต้องการชื่อรุ่น

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

81
ยอดเยี่ยม สิ่งนี้ควรล้อมรอบด้วย try / catch สำหรับ NameNotFoundException
IgorGanapolsky

6
+1 ฉันได้ใช้งานโซลูชันของคุณซึ่งใช้งานได้ดีมาก! อย่างไรก็ตามการแก้ปัญหานี้ควรล้อมรอบด้วยลองและจับเช่น Igor กล่าวและมันเป็นวิธีปฏิบัติที่ดี (เช่นสำหรับการแก้จุดบกพร่อง) ที่จะทำให้การเรียกแต่ละวิธีในบรรทัดแยกต่างหากแทนการเรียกบริบทบริบทวิธี (). ในบรรทัดเดียว ดังนั้นฉันจึงให้วิธีการแก้ปัญหาที่สะอาดกว่าด้านล่าง
Michael

1
นั่นเป็นคำตอบที่ถูกต้องขอบคุณ;) แต่ตามที่ @IgorGanapolsky แนะนำก็ต้องถูกล้อมรอบด้วย try / catch :)
andrea.rinaldi

2
สำหรับผู้ที่ใช้ Gradle - มีวิธีแก้ปัญหาที่ง่ายกว่า ดูคำตอบของฉันด้านล่าง
Sam Dozor

1
@ เออร์วินนัสฉันไม่เห็นด้วยอย่างยิ่งกับความคิดในการใช้ข้อยกเว้นทั่วไปในการจับสิ่งต่างๆเช่นนี้ ข้อยกเว้นที่ละเอียดยิ่งขึ้นแสดงให้เห็นถึงความเข้าใจของนักพัฒนาเกี่ยวกับข้อผิดพลาดที่อาจเกิดขึ้น
IgorGanapolsky

173

มีสองส่วนที่คุณต้องการ: android: versionCode android: versionName

versionCode เป็นตัวเลขและแอพทุกเวอร์ชันที่คุณส่งไปยัง Market จะต้องมีตัวเลขที่สูงกว่าและเป็นเวอร์ชันสุดท้าย

VersionName เป็นสตริงและสามารถเป็นอะไรก็ได้ที่คุณต้องการ นี่คือที่ที่คุณกำหนดแอปของคุณเป็น "1.0" หรือ "2.5" หรือ "2 Alpha EXTREME!" หรืออะไรก็ตาม

ตัวอย่าง:

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 android:versionCodeและandroid:versionNameสามารถพบได้ที่นี่: developer.android.com/tools/publishing/…
Jeffro

2
นี้ในกรณีนี้คือบริบทกิจกรรม .ie, บริการ ฯลฯ
peterchaula

3
เมื่อคุณวางโค้ดตัวอย่างบางส่วนจะเป็นประโยชน์ในการอธิบายความหมายของพารามิเตอร์ .... ทุกคนสามารถเข้าใจสิ่งที่this.getPackageName()แสดงให้เห็นว่า0คุณเพียงแค่ถ่มน้ำลายไม่มีความหมายเกี่ยวกับความหมาย
Rafael Lima

Android Studio อ้างว่า versionCode เลิกใช้แล้ว
Roman Gherta

1
@RomanGherta เป็นของ API 28. ถ้าคุณกำลังเขียนโค้ดโดยใช้อะไรน้อย (หรือ 8 ปีที่แล้วเมื่อเขียนคำตอบนี้) คุณควรจะดีต่อไป คำตอบอื่นที่นี่มีวิธีการอัพเดท
Merkidemis

145

ใช้ Gradle และ BuildConfig

รับ VERSION_NAME จาก BuildConfig

BuildConfig.VERSION_NAME

ใช่มันเป็นเรื่องง่ายในขณะนี้

มันจะส่งคืนสตริงว่างเปล่าสำหรับ VERSION_NAME หรือไม่

หากคุณได้รับสตริงว่างBuildConfig.VERSION_NAMEแล้วอ่านต่อ

ฉันยังคงได้รับสตริงว่างBuildConfig.VERSION_NAMEเพราะฉันไม่ได้ตั้งค่าversionNameในไฟล์ build ของฉัน (ฉันย้ายจาก ANT ไปยัง Gradle) ดังนั้นนี่คือคำแนะนำเพื่อให้แน่ใจว่าคุณกำลังตั้งค่าของคุณVERSION_NAMEผ่าน Gradle

build.gradle

def versionMajor = 3
def versionMinor = 0
def versionPatch = 0
def versionBuild = 0 // bump for dogfood builds, public betas, etc.

android {

  defaultConfig {
    versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild

    versionName "${versionMajor}.${versionMinor}.${versionPatch}"
  }

}

หมายเหตุ: นี่คือจากเก่งเจควอร์ตัน

การลบversionNameและversionCodeออกจากAndroidManifest.xml

และเนื่องจากคุณได้ตั้งค่าversionNameและversionCodeในbuild.gradleไฟล์ตอนนี้คุณจึงสามารถลบAndroidManifest.xmlไฟล์เหล่านั้นออกจากไฟล์ของคุณได้หากมี


5
สิ่งนี้ใช้ได้ดีตราบใดที่คุณเข้าถึง BuildConfig จากโครงการแอปพลิเคชันไม่ใช่ไลบรารีที่ใช้ในโครงการแอปพลิเคชัน มิฉะนั้นคุณจะได้รับ BuildConfig สำหรับโครงการห้องสมุดไม่ใช่แอปพลิเคชัน
John Cummings

@JohnCummings น่าสนใจ ... ไม่คิดอย่างนั้น
Joshua Pinter

ไม่ได้ทำงานที่ทั้งหมดversionName "1.2"และผลตอบแทนBuildConfig.VERSION_NAME emptyAPI> 21
Sojtin

จากการติดตามเราหยุดใช้วิธีนี้แทนจำนวนเต็มและสตริงคงที่สำหรับversionCodeและversionNameตามลำดับ เนื่องจากเครื่องมือบางอย่างเช่น Code Push พยายามที่จะรับหมายเลขรุ่นของคุณโดยการแยกbuild.gradleไฟล์ของคุณและพวกเขาไม่สามารถเต็มค่าแบบไดนามิก
Joshua Pinter

@JoshuaPinter PackageManager เป็นตัวเลือกที่ปลอดภัยที่สุดจริงๆ หากคุณใช้การแทนที่รหัสเวอร์ชันสำหรับการแยกค่าคงที่ BuildConfig ยังคงเก็บค่าดั้งเดิม (แม้ว่าจะมีการแต่งกลิ่น)
Eugen Pechanec

54

นี่คือคำตอบที่สะอาดโดยอิงตามวิธีแก้ปัญหาของ scottyab (แก้ไขโดย Xavi) มันแสดงให้เห็นวิธีการรับบริบทก่อนหากไม่ได้จัดทำโดยวิธีการของคุณ นอกจากนี้ยังใช้หลายบรรทัดแทนการเรียกหลายวิธีต่อบรรทัด สิ่งนี้ทำให้ง่ายขึ้นเมื่อคุณต้องดีบักแอปพลิเคชันของคุณ

Context context = getApplicationContext(); // or activity.getApplicationContext()
PackageManager packageManager = context.getPackageManager();
String packageName = context.getPackageName();

String myVersionName = "not available"; // initialize String

try {
    myVersionName = packageManager.getPackageInfo(packageName, 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

ตอนนี้คุณได้รับชื่อรุ่นใน String myVersionNameแล้วคุณสามารถตั้งเป็น TextView หรืออะไรก็ได้ที่คุณต้องการ ..

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

คุณคิดว่า NNFE สามารถถูกโยนทิ้งได้จริงหรือ มันจะแปลกที่จะไม่พบแอปพลิเคชั่นที่ทำงานอยู่ในตัวจัดการแพกเกจ :)
TWiStErRob

ฉันกับคุณว่ามันอาจจะแปลก แต่ก็เป็นข้อยกเว้นค่าเริ่มต้นของวิธีนี้ - ดูAPI : Throws PackageManager.NameNotFoundException if a package with the given name can not be found on the system.มันบอกว่า อย่างไรก็ตามฉันไม่สามารถจินตนาการถึงสถานการณ์นั้นได้!
Michael

38

เพื่อรับรุ่นแอพหรือรหัสบิวด์ซึ่งใช้เพื่อระบุ apk ด้วยรหัสเวอร์ชัน รหัสเวอร์ชั่นใช้ในการตรวจจับการกำหนดค่าบิวด์ที่แท้จริง ณ เวลาที่ทำการอัพเดทเผยแพร่ ฯลฯ

int versionCode = BuildConfig.VERSION_CODE;

ชื่อรุ่นใช้เพื่อแสดงผู้ใช้หรือผู้พัฒนาลำดับการพัฒนา คุณสามารถเพิ่มชื่อรุ่นได้ตามต้องการ

String versionName = BuildConfig.VERSION_NAME;

34

ใช้คลาส BuildConfig

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

build.gradle (app)

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

23

หากคุณใช้ PhoneGap ให้สร้างปลั๊กอิน PhoneGap ที่กำหนดเอง:

สร้างคลาสใหม่ในแพ็คเกจของแอปของคุณ:

package com.Demo; //replace with your package name

import org.json.JSONArray;

import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;

import com.phonegap.api.Plugin;
import com.phonegap.api.PluginResult;
import com.phonegap.api.PluginResult.Status;

public class PackageManagerPlugin extends Plugin {

    public final String ACTION_GET_VERSION_NAME = "GetVersionName";

    @Override
    public PluginResult execute(String action, JSONArray args, String callbackId) {
        PluginResult result = new PluginResult(Status.INVALID_ACTION);
        PackageManager packageManager = this.ctx.getPackageManager();

        if(action.equals(ACTION_GET_VERSION_NAME)) {
            try {
                PackageInfo packageInfo = packageManager.getPackageInfo(
                                              this.ctx.getPackageName(), 0);
                result = new PluginResult(Status.OK, packageInfo.versionName);
            }
            catch (NameNotFoundException nnfe) {
                result = new PluginResult(Status.ERROR, nnfe.getMessage());
            }
        }

        return result;
    }
}

ใน plugins.xml เพิ่มบรรทัดต่อไปนี้:

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

ในเหตุการณ์ devicereadyของคุณเพิ่มรหัสต่อไปนี้:

var PackageManagerPlugin = function() {

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

จากนั้นคุณสามารถรับแอตทริบิวต์ versionName ได้โดยทำดังนี้

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

ที่ได้มาจากที่นี่และที่นี่


9
คำถามไม่เกี่ยวกับ PhoneGap คำตอบของคุณอาจทำให้ผู้คนสับสน
likebobby

8
@ บ๊อบบี้ J ไม่มีที่ไหนในคำถามชื่อหรือแท็กระบุว่าคำถามนั้นเกี่ยวกับแอปพลิเคชันแบบเนทีฟ นี่คือสิ่งที่เกิดขึ้นบน google เมื่อฉันค้นหาคำตอบและจะช่วยฉันหลายชั่วโมง
Sean Hall

ขอบคุณ Hall72215 ฉันจะดีใจกับสิ่งนี้ ... หากไม่มีวิธีอื่นใดที่จะได้รับหมายเลขเวอร์ชันของคุณเอง? ฉันควรหลีกเลี่ยงปลั๊กอินถ้าเป็นไปได้!
แมกนัสสมิ ธ

@MagnusSmith ไม่เว้นแต่ PhoneGap / Cordova ได้เพิ่มไว้ในฟังก์ชั่นในตัว
Sean Hall

ในตัวอย่างนี้คุณสามารถดูว่ามันโง่แค่ไหนที่จะใช้โซลูชันของบุคคลที่สามเพื่อสร้างแอพ เมื่อคุณเขียนเองตั้งแต่เริ่มต้นมันเป็นเพียงสองสามบรรทัดในการเขียนโค้ด
Codebeat

19

Kotlin one-liners

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

ตรวจสอบให้แน่ใจว่าได้นำเข้าBuildConfigสู่ชั้นเรียนของคุณ


13

สำหรับผู้ใช้ xamarin ใช้รหัสนี้เพื่อรับชื่อรุ่นและรหัส

1) ชื่อรุ่น:

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

2) รหัสเวอร์ชั่น:

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

12

หากคุณต้องการใช้กับ xml ให้เพิ่มบรรทัดด้านล่างลงในไฟล์ gradle ของคุณ:

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

จากนั้นใช้บน xml ของคุณเช่นนี้:

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

ฉันได้รับในรูปแบบ XML ของฉันข้อผิดพลาด: ไม่สามารถแก้ไขสัญลักษณ์ '@ สตริง / versionName'
RJB

12

ไม่คุณไม่จำเป็นต้องทำอะไรกับ AndroidManifest.xml

โดยพื้นฐานแล้วชื่อเวอร์ชันของแอปและรหัสเวอร์ชันภายในไฟล์gradle ระดับแอปภายใต้แท็กdefaultConfig :

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

หมายเหตุ: เมื่อคุณต้องการอัปโหลดแอปใน playstore สามารถตั้งชื่อเป็นชื่อเวอร์ชั่นได้ แต่รหัสเวอร์ชั่นจะต้องแตกต่างจากรหัสเวอร์ชั่นปัจจุบันหากแอพนี้อยู่ใน Play store อยู่แล้ว

เพียงใช้ข้อมูลโค้ดต่อไปนี้เพื่อรับรหัสเวอร์ชั่นและชื่อรุ่นจากที่ใดก็ได้ในแอปของคุณ:

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 ดังที่ระบุในเอกสารให้ใช้ longVersionCode แทน developer.android.com/reference/android/content/pm/…
Dan Abnormal

11

สำหรับ Api 28 PackageInfo.versionCode ไม่ได้รับการสนับสนุนดังนั้นใช้รหัสนี้ด้านล่าง:

    Context context = getApplicationContext();
    PackageManager manager = context.getPackageManager();
    try {
        PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
        myversionName = info.versionName;
        versionCode = (int) PackageInfoCompat.getLongVersionCode(info);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        myversionName = "Unknown-01";
    }

9

ทำกับtry catchบล็อกเสมอ:

String versionName = "Version not found";

try {
    versionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
    Log.i(TAG, "Version Name: " + versionName);
} catch (NameNotFoundException e) {
    // TODO Auto-generated catch block
    Log.e(TAG, "Exception Version Name: " + e.getLocalizedMessage());
}

9

นี่คือวิธีการรับรหัสเวอร์ชัน:

public String getAppVersion() {
    String versionCode = "1.0";
    try {
        versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
    } catch (PackageManager.NameNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return versionCode;
}

3
วิธีที่ดีกว่า - BuildConfig.VERSION_CODE
Jaydev

8

ฉันได้แก้ไขสิ่งนี้โดยใช้คลาสการตั้งค่า

package com.example.android;

import android.content.Context;
import android.preference.Preference;
import android.util.AttributeSet;

public class VersionPreference extends Preference {
    public VersionPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        String versionName;
        final PackageManager packageManager = context.getPackageManager();
        if (packageManager != null) {
            try {
                PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
                versionName = packageInfo.versionName;
            } catch (PackageManager.NameNotFoundException e) {
                versionName = null;
            }
            setSummary(versionName);
        }
    }
}

8

มีบางวิธีในการรับversionCodeและversionNameเขียนโปรแกรม

  1. PackageManagerรับเวอร์ชันจาก นี่เป็นวิธีที่ดีที่สุดสำหรับกรณีส่วนใหญ่
try {
    String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
    int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
  1. BuildConfig.javaได้รับจากการสร้าง แต่โปรดสังเกตว่าถ้าคุณเข้าถึงค่านี้ในไลบรารีมันจะคืนค่าเวอร์ชันไลบรารีไม่ใช่แอปหนึ่งที่ใช้ไลบรารีนี้ ดังนั้นใช้เฉพาะในโครงการที่ไม่ใช่ห้องสมุด!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

มีรายละเอียดบางอย่างยกเว้นการใช้วิธีที่สองในโครงการห้องสมุด ใน android gradle plugin ใหม่ (3.0.0+) ฟังก์ชันบางอย่างถูกลบออกไป ดังนั้นสำหรับตอนนี้คือการตั้งค่ารุ่นที่แตกต่างกันสำหรับรสชาติที่แตกต่างไม่ทำงานอย่างถูกต้อง

วิธีที่ไม่ถูกต้อง:

applicationVariants.all { variant ->
    println('variantApp: ' + variant.getName())

    def versionCode = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
    def versionName = {SOME_GENERATED_VALUE_IE_TIMESTAMP}

    variant.mergedFlavor.versionCode = versionCode
    variant.mergedFlavor.versionName = versionName
}

รหัสด้านบนจะตั้งค่าอย่างถูกต้องBuildConfigแต่จากPackageManagerคุณจะได้รับ0และnullหากคุณไม่ได้ตั้งค่ารุ่นในdefaultการกำหนดค่า ดังนั้นแอปของคุณจะมี0รหัสเวอร์ชั่นในอุปกรณ์

มีวิธีแก้ไข - ตั้งค่าเวอร์ชันสำหรับapkไฟล์เอาต์พุตด้วยตนเอง:

applicationVariants.all { variant ->
    println('variantApp: ' + variant.getName())

    def versionCode = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
    def versionName = {SOME_GENERATED_VALUE_IE_TIMESTAMP}

    variant.outputs.all { output ->
        output.versionCodeOverride = versionCode
        output.versionNameOverride = versionName
    }
}

6

รหัสนี้ถูกกล่าวถึงข้างต้นเป็นชิ้น ๆ แต่ที่นี่มันรวมทั้งหมดอีกครั้ง คุณต้องมีบล็อก try / catch เนื่องจากอาจมี "NameNotFoundException"

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

ฉันหวังว่านี่จะช่วยลดความยุ่งยากให้กับใครบางคนตามถนน :)


5

คนที่ไม่ต้องการข้อมูล BuildConfig สำหรับ UI ของแอปพลิเคชัน แต่ต้องการใช้ข้อมูลเหล่านี้เพื่อตั้งค่าการกำหนดค่างาน CI หรืออื่น ๆ เช่นฉัน

มีไฟล์ที่สร้างขึ้นโดยอัตโนมัติคือ BuildConfig.java ภายใต้ไดเรกทอรีโครงการของคุณตราบใดที่คุณสร้างโครงการของคุณสำเร็จ

{WORKSPACE} / สร้าง / สร้าง / แหล่งที่มา / buildConfig / {แก้ปัญหา | ปล่อย} / {} 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";
}

แบ่งข้อมูลที่คุณต้องการด้วยสคริปต์ไพ ธ อนหรือเครื่องมืออื่น ๆ นี่คือตัวอย่าง:

import subprocess
#find your BuildConfig.java
_BuildConfig = subprocess.check_output('find {WORKSPACE} -name BuildConfig.java', shell=True).rstrip()
#get the version name
_Android_version = subprocess.check_output('grep -n "VERSION_NAME" '+_BuildConfig, shell=True).split('"')[1]
print('Android version :’+_Android_version)

โปรดแก้ตัวภาษาอังกฤษของฉันที่ จำกัด แต่หวังว่าสิ่งนี้จะช่วยได้


4
 package com.sqisland.android.versionview;

import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView textViewversionName = (TextView) findViewById(R.id.text);

    try {
        PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        textViewversionName.setText(packageInfo.versionName);

    }
    catch (PackageManager.NameNotFoundException e) {

    }

  }
}

สวัสดี @donmj หากคุณใช้รูทที่เป็นทางการสำหรับอุปกรณ์ Android ฉันต้องการคุณ นี่คือแนวทางของฉัน
Durul Dalkanat

ขอบคุณสำหรับความช่วยเหลือ @Durul Dalkanat :)
donmj

4

ลองอันนี้:

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

3

ครั้งแรก:

import android.content.pm.PackageManager.NameNotFoundException;

แล้วใช้สิ่งนี้:

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

1
ไม่มีร่างกายไม่มีเวลาสำหรับเรื่องนั้น
BlaShadow

3
private String GetAppVersion(){
        try {
            PackageInfo _info = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0);
            return _info.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return "";
        }
    }

    private int GetVersionCode(){
        try {
            PackageInfo _info = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0);
            return _info.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return -1;
        }
    }

3

ตัวอย่างการใช้งาน Fragment

        import android.content.pm.PackageManager;
        .......

        private String VersionName;
        private String VersionCode;
        .......


        Context context = getActivity().getApplicationContext();

        /*Getting Application Version Name and Code*/
        try
        {

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

             /*I find usefull to convert vervion code into String, so it's ready for TextViev/server side checks*/ 

             VersionCode = Integer.toString(context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode);
        } catch (PackageManager.NameNotFoundException e)
        {
             e.printStackTrace();
        }

// DO SOMETHING USEFULL WITH THAT

คุณควรดูคำตอบอื่น ๆ ก่อนโพสต์คำตอบของคุณ เช่นสำหรับบริบทที่คุณกำลังทำ getActivity.getApplicationContext หากคุณอยู่ในส่วนแล้วฉันสามารถเข้าใจ แต่ถ้าคุณอยู่ในกิจกรรมฉันไม่คิดว่าคุณจะต้องเรียก getActivity
Sahil Manchanda

ในกรณีของฉันฉันทำเพื่อชิ้นส่วน รหัสนี้ใช้ภายใน onCreate
Sapphire91140

3

ตัวอย่าง 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())
    }
}

ไม่ต้องขอบคุณ :-)


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

เพราะฉันต้องได้รับรหัสเวอร์ชั่นเท่านั้นและตรวจสอบว่าแอพได้รับการอัปเดตหรือไม่ถ้าใช่ฉันต้องเปิด playstore เพื่อรับการอัปเดต ฉันทำแบบนี้

public class CheckForUpdate {

public static final String ACTION_APP_VERSION_CHECK="app-version-check";

public static void launchPlayStoreApp(Context context)
{

    final String appPackageName = context.getPackageName(); // getPackageName() from Context or Activity object
    try {
        context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
    } catch (android.content.ActivityNotFoundException anfe) {
        context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
    }

}

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

}

จากนั้นฉันบันทึกรหัสเวอร์ชันโดยใช้การตั้งค่าที่แบ่งปันโดยการสร้างคลาส util

public class PreferenceUtils {

// this is for version code
private  final String APP_VERSION_CODE = "APP_VERSION_CODE";
private  SharedPreferences sharedPreferencesAppVersionCode;
private SharedPreferences.Editor editorAppVersionCode;
private static Context mContext;

public PreferenceUtils(Context context)
{
    this.mContext=context;
    // this is for app versioncode
    sharedPreferencesAppVersionCode=mContext.getSharedPreferences(APP_VERSION_CODE,MODE_PRIVATE);
    editorAppVersionCode=sharedPreferencesAppVersionCode.edit();
}

public void createAppVersionCode(int versionCode) {

    editorAppVersionCode.putInt(APP_VERSION_CODE, versionCode);
    editorAppVersionCode.apply();
}

public int getAppVersionCode()
{
    return sharedPreferencesAppVersionCode.getInt(APP_VERSION_CODE,0); // as default  version code is 0
     }
   }

2

ในปี 2020: API 28 "versionCode" ถูกคัดค้านเพื่อให้เราสามารถใช้"longVersionCode"

โค้ดตัวอย่างใน 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

มีประโยชน์สำหรับการสร้างระบบ: มีไฟล์ที่สร้างขึ้นด้วย apk ของคุณชื่อoutput.jsonซึ่งมีอาร์เรย์ของข้อมูลสำหรับ APK ที่สร้างขึ้นแต่ละรายการรวมถึง versionName และ versionCode

เช่น

[
    {
        "apkInfo": {
            "baseName": "x86-release",
            "enabled": true,
            "filterName": "x86",
            "fullName": "86Release",
            "outputFile": "x86-release-1.0.apk",
            "splits": [
                {
                    "filterType": "ABI",
                    "value": "x86"
                }
            ],
            "type": "FULL_SPLIT",
            "versionCode": 42,
            "versionName": "1.0"
        },
        "outputType": {
            "type": "APK"
        },
        "path": "app-x86-release-1.0.apk",
        "properties": {}
    }
]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.