在代码中获取Android清单文件中的android:versionName元素

69
我想知道如何通过代码解析AndroidManifest.xml文件,以获取应用程序版本号。具体来说,是android:versionName的值。

1
如果您正在使用Gradle,可以使用BuildConfig.VERSION_NAME获取应用程序的versionName。请参见此处的答案:https://dev59.com/C2445IYBdhLWcg3w9Ows#28352130 - Joshua Pinter
4个回答

144

不需要解析 AndroidManifest.xml 文件来获取此信息。

你可以使用以下方法获得:

try
{
    String app_ver = this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
}
catch (NameNotFoundException e)
{
    Log.e(tag, e.getMessage());
}

在您的onCreate()方法内使用此代码。


我需要比较我的应用程序android: versionName和下载中的应用。我的应用程序不在安卓市场上。我需要将手机中的versionName与网站中的versionName进行比较,以获得新版本并显示更新警报。如何获取网站中应用程序的新版本号? - jennifer
@jebbifer:只需从您的应用程序创建一个“Http Get”请求,并将该值作为该请求的参数发送即可。在您的服务器上,您需要处理该请求并比较应用程序版本值。如果大于客户端应用程序,则在响应中向其发送下载该应用程序新版本的链接。 - Vikas Patidar

35

如果对其他人有帮助的话,你也可以像在其他xml文件中一样从AndroidManifest.xml中访问@string资源。

例如,在AndroidManifest.xml中:

android:versionName="@string/app_versionName"

在代码中:

string versionName = getResources().getString(R.string.app_versionName);

这种方法不需要(我认为很烦人的)try/catch语句。我不确定这是否是一种被批准的做法,但对我来说很有意义。


1
很棒的解决方案!不要直接从清单文件中编辑字符串,而是使用字符串值进行编辑,这样你的代码就不会改变了!我喜欢!+2 :P - S.Thiongane
4
请注意此lint警告信息android:versionName不能是资源链接,必须是字面值字符串 - S.Thiongane
真遗憾。这个lint消息一定是最近才出现的;我不记得在我处理这个问题时看到过它。 - ForeverWintr

10
如果您正在使用Android Studio,版本名称可在类BuildConfig中找到。该类是在编译时生成的。
String versionName = BuildConfig.VERSION_NAME;

这是检索版本名称最干净的方式。


根据https://developer.android.com/studio/publish/versioning,versionName应该在Gradle中而不是清单文件中。这种方法从Gradle中读取。 - Ben

2

到目前为止,我已经使用了来自这篇文章中给出的以下代码片段,并成功地从AndroidManifest.xml文件中获取了版本代码版本名称

/* Get android:versionName */
String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;

/* Get android:versionCode */
int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;

请详细说明您的答案,因为仅包含链接的答案在 SO 上并不被认为是好的。 - Mike Szyndel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接