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

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

我必须对AndroidManifest.xml做些事情吗?

答案

采用:

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

您可以使用此代码获取版本代码

int verCode = pInfo.versionCode;

如果您使用的是 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"
}

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

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

您需要两个部分: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();

使用 Gradle 和 BuildConfig

从 BuildConfig 获取 VERSION_NAME

BuildConfig.VERSION_NAME

是的,现在就这么简单。

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

如果您获得BuildConfig.VERSION_NAME的空字符串,请继续阅读。

我一直没有获得BuildConfig.VERSION_NAME的空字符串,因为我没有在我的 Grade 构建文件中设置versionName (我从 ANT 迁移到 Gradle)。因此,以下说明可确保您通过 Gradle 设置VERSION_NAME

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)的杰作。

AndroidManifest.xml删除versionNameversionCode

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

这是基于 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();
}

现在您已经在字符串myVersionName收到了版本名称,您可以将其设置为 TextView 或任何您喜欢的名称。

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

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

获取应用版本或用于通过其版本代码标识 apk 的构建代码。版本代码用于在更新,发布等时检测实际的构建配置。

int versionCode = BuildConfig.VERSION_CODE;

版本名称用于显示开发顺序的用户或开发人员。您可以根据需要添加任何版本名称

String versionName = BuildConfig.VERSION_NAME;

如果您使用的是 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
    }
);

这里这里

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