如何获取您的Android应用程序的内部版本号?


1284

我需要弄清楚如何获取或制作Android应用程序的内部版本号。我需要内部版本号才能显示在UI中。

我需要做什么AndroidManifest.xml吗?


2
不确定,但是我认为您可以通过解析AndroidManifest.xml文件来获取它。
Sunit Kumar Gupta,


要获取版本代码,请使用int versionCode = BuildConfig.VERSION_CODE;并获取版本名称String versionName = BuildConfig.VERSION_NAME;
-Lukas

Answers:


2039

采用:

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 2013年

35
并且不要忘记try... catch..何时getPackageInfo()
anticafe 2014年

4
@Gubatron我在下面的答案允许静态检索这些值。
山姆·多佐

25
如果只想获取应用程序的版本,则这是两个复杂的过程。您应该BuildConfig.VERSION_**按照此处的建议使用。
TimoBähr16年

1912

如果您使用的是Gradle插件/ Android Studio,则从0.7.0版开始,版本代码和版本名称在中静态可用BuildConfig确保您导入的是应用包,而不是其他BuildConfig

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

无需上下文对象!

另外,请确保在build.gradle文件中指定它们,而不是AndroidManifest.xml

defaultConfig {
    versionCode 1
    versionName "1.0"
}

177
实际上,这比所有上下文和程序包管理器要好得多,谢谢。
superjugy

16
实际上,这是启动Android Studio之后的最佳解决方案!!!从我身边+1
Dhruvil Patel 2014年

15
这不是很可靠。版本名称大多数时候都显示为空字符串。
Binoy Babu 2014年

20
@BinoyBabu,如果您versionNamebuild.gradle文件中为应用指定了a ,则它永远不会显示为空字符串。
Sam Dozor 2014年

39
您需要导入正确的软件包才能正常工作:import com.yourapppackage.android.BuildConfig
Eric B.

436

如果只需要版本名称,则版本略短。

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

81
优秀的。对于NameNotFoundException,可能应该用try / catch包围。
IgorGanapolsky

6
+1我已经实施了您的解决方案,效果很好!但是,此解决方案应该像Igor所说的那样,由try and catch包围,并且将每个方法调用放在单独的行而不是调用context.methodName()。subMethod()。anotherSubMethod()等是一种很好的做法(例如,用于调试) 。在一行上。因此,我在下面
迈克尔·

1
谢谢,这是正确的解决方案;)但是,正如@IgorGanapolsky所建议的那样,它必须用try / catch包围:)
andrea.rinaldi 2014年

2
对于使用Gradle的用户-有一个更简单的解决方案。请参阅下面的答案。
山姆·多佐

1
@Erwinus我完全不同意使用通用Exception捕获此类内容的想法。更细粒度的异常表明开发人员对可能的错误的理解。
IgorGanapolsky

173

您需要两个部分:android:versionCode android:versionName

versionCode是一个数字,您提交给电子市场的应用程序的每个版本都必须具有比上一个更高的数字。

VersionName是一个字符串,可以是您想要的任何字符串。您可以在此处将应用定义为“ 1.0”或“ 2.5”或“ 2 Alpha EXTREME!”。管他呢。

例:

科特林:

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活动,服务.etc
peterchaula

3
当您粘贴一些示例代码对解释参数的含义很有用.... althoug每个人都可以理解this.getPackageName()代表0您所吐出的含义的东西根本没有任何线索
Rafael Lima

Android Studio声称versionCode已弃用
Roman Gherta

1
@RomanGherta从API 28开始。如果您使用更少的内容(或8年前编写此答案时)来编写代码,那么您仍然应该很好。这里的另一个答案是更新的方法。
Merkidemis

145

使用Gradle和BuildConfig

从BuildConfig获取VERSION_NAME

BuildConfig.VERSION_NAME

是的,现在就这么简单。

它是否为VERSION_NAME返回空字符串?

如果您得到一个空字符串 BuildConfig.VERSION_NAME继续阅读。

我一直没有得到一个空字符串,BuildConfig.VERSION_NAME因为我没有versionName在我的成绩构建文件中设置(我从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}"
  }

}

注意:这是来自杰克·沃顿(Jake Wharton)的杰作。

删除versionNameversionCodeAndroidManifest.xml

并且由于您现在已经在文件中设置了versionNameversionCode,因此如果它们已经存在build.gradle,也可以将其从AndroidManifest.xml文件中删除。


5
只要您从应用程序项目而不是应用程序项目中使用的库访问BuildConfig,这就很好用。否则,您将获得库项目而不是应用程序的BuildConfig。
John Cummings

@JohnCummings有趣的...没想到。
2015年

根本不工作versionName "1.2",然后BuildConfig.VERSION_NAME返回empty。API> 21
Sojtin

作为后续,我们实际上停止使用此方法,而只支持为versionCodeversionName分别使用静态整数和静态String 。仅仅是因为诸如代码推送之类的某些工具试图通过解析build.gradle文件来获取您的版本号,并且它们无法充满动态值。
约书亚·品特

@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 '16

我与您在一起可能会很奇怪,但这是此方法的默认例外-请参阅API:它说Throws PackageManager.NameNotFoundException if a package with the given name can not be found on the system.。但是,我无法想象这种情况!
迈克尔

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(应用程序)

 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 2012年

8
@BobbyJ在问题,标题或标签的任何地方都没有指定问题与本机应用程序有关。这就是我在寻找答案时在Google上出现的内容,它将为我节省几个小时。
肖恩·霍尔

感谢Hall72215。如果没有其他方法可以获取自己的版本号,我将为此感到高兴。如果可能,我宁愿避免使用插件!
Magnus Smith

@MagnusSmith除非PhoneGap / Cordova已将其添加到其内置函数中,否则不会。
肖恩·霍尔

在此示例中,您可以看到使用第三方解决方案创建应用程序有多愚蠢。当您从头开始编写代码时,只需编写几行代码。
Codebeat

19

Kotlin单线

  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中遇到错误:无法解析符号'@ string / versionName'–
RJB

12

不,您不需要使用AndroidManifest.xml做任何事情

基本上,您的应用的版本名称和版本代码位于应用级别gradle文件中的defaultConfig标签下:

defaultConfig {  
   versionCode 1  
   versionName "1.0"  
}  

注意:当您希望在Play商店中上传应用时,可以使用任何名称作为版本名称,但是如果此应用已在Play商店中,则版本代码必须与当前版本代码不同。

只需使用以下代码段即可从应用程序中的任何位置获取版本代码版本名称

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

1
API 28中不推荐使用versionCode。如文档所述,请改用longVersionCode;developer.android.com/reference/android/content/pm/...
丹异常

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 catchblock 来做:

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

8

我通过使用Preference类解决了这个问题。

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

有一些获取方法versionCodeversionName编程方式。

  1. 从获取版本PackageManager。这是大多数情况下的最佳方法。
try {
    String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
    int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
  1. 从generate获取它BuildConfig.java。但是请注意,如果您要在库中访问此值,它将返回使用该库的库版本,而不是应用程序版本。因此,仅可用于非图书馆项目!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

除了在库项目中使用第二种方式外,还有一些细节。在新的android gradle插件(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您会收到0null如果你没有在组版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

不需要应用程序UI的BuildConfig信息的人但是想要使用这些信息来设置CI作业配置或其他人,例如我。

只要您成功构建项目,项目目录下就会有一个自动生成的文件BuildConfig.java。

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

通过python脚本或其他工具拆分所需的信息。这是一个例子:

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设备使用非官方root。我想,您将需要。这是我的方法。
Durul Dalkanat 2015年

感谢@Durul Dalkanat的帮助:)。
donmj 2015年

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
不是没有人有时间这样做。
BlaShadow15年

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

内部片段用法示例。

        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

就我而言,我是为Fragment制作的。代码用于内部的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": {}
    }
]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.