如何获得您的Android应用程序的构build/版本号?

我需要弄清楚如何获取或为我的Android应用程序构build编号。 我需要在UI中显示内部版本号。

我必须使用AndroidManifest.xml做些什么吗?

使用:

  try { PackageInfo pInfo = this.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; 

使用Gradle和BuildConfig

从BuildConfig获取VERSION_NAME

 BuildConfig.VERSION_NAME 

是的,现在就这么简单

它是否为VERSION_NAME返回空string?

如果您正在为BuildConfig.VERSION_NAME获取空string,请继续阅读。

我不断收到BuildConfig.VERSION_NAME的空string,因为我没有在我的成绩构build文件(我从ANT迁移到Gradle)中设置versionName 。 所以,这里是确保您通过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}" } } 

注:这是来自杰出的沃顿商学院 。

AndroidManifest.xml删除versionNameversionCode

由于您现在已经在build.gradle文件中设置了versionNameversionCode ,所以您也可以将它们从AndroidManifest.xml文件中移除(如果它们在那里)。

有两个部分你需要:android:versionCode android:versionName

versionCode是一个数字,你提交给市场的每个应用程序版本都需要有一个更高的数字,然后是最后一个数字。

VersionName是一个string,可以是任何你想要的东西。 这是您定义您的应用为“1.0”或“2.5”或“2 Alpha EXTREME!”的地方 pipe他呢。

例:

要在代码中访问它,请执行以下操作:

 PackageManager manager = this.getPackageManager(); PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0); Toast.makeText(this, "PackageName = " + info.packageName + "\nVersionCode = " + info.versionCode + "\nVersionName = " + info.versionName + "\nPermissions = " + info.permissions, Toast.LENGTH_SHORT).show(); 

这是一个干净的解决scheme ,基于scottyab的解决scheme(由Xavi编辑)。 它显示了如何首先获取上下文,如果它不是由您的方法提供的。 此外,它使用多行,而不是每行调用多个方法。 这使得您必须debugging应用程序时更容易。

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

现在,您已经收到了stringmyVersionName的版本名称,您可以将其设置为一个TextView或任何你喜欢的..

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

如果您使用PhoneGap,则创build一个自定义的PhoneGap插件:

在应用程序包中创build一个新类:

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

从这里和这里派生。

一个非常简单的方法是:

 private String appVersion = BuildConfig.VERSION_NAME; 

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

以下是获取版本代码的方法:

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

我使用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); } } } 

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

如果你想在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" /> 

有些人不需要应用程序UI的BuildConfig信息,但是想要使用这些信息来设置CI作业configuration,或者像我一样。

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

{WORKSPACE} /build立/生成/源极/ buildConfig / {debugging|释放} / {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) 

请原谅我有限的英语能力,但希望这有助于。

这个代码在上面被提到了,但是在这里它又被包含了。 你需要一个try / catch块,因为它可能会抛出一个“NameNotFoundException”。

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

我希望这可以简化一些路上的事情。 🙂

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

第一:

 import android.content.pm.PackageManager.NameNotFoundException; 

然后使用这个:

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

试试这个:

 try { device_version = getPackageManager().getPackageInfo("com.google.android.gms", 0).versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } 
 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; } } 

内部片段使用示例。

  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 

有一些方法可以以编程方式获取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. 从生成的BuildConfig.java获取它。 但请注意,如果您将在库中访问这个值,它将返回使用此库的库版本,而不是应用程序。 所以只能在非库项目中使用!
 String versionName = BuildConfig.VERSION_NAME; int versionCode = BuildConfig.VERSION_CODE; 

有一些细节,除了在图书馆项目中使用第二种方式。 在新的Android gradle插件(3.0.0+)中删除了一些function 。 所以,现在,即设置不同的版本为不同的口味不正确工作。

错误的方法:

 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正确设置值,但是如果您没有在defaultconfiguration中设置版本,则将从PackageManager接收0null 。 所以你的应用程序将在设备上有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 } }