Android SDK 28 - PackageInfo 中的 versionCode 已被弃用
Posted
技术标签:
【中文标题】Android SDK 28 - PackageInfo 中的 versionCode 已被弃用【英文标题】:Android SDK 28 - versionCode in PackageInfo has been deprecated 【发布时间】:2019-03-29 08:18:31 【问题描述】:我刚刚将我的应用程序的 compileSdkVersion
升级到 28
(Pie)。
我收到编译警告:
警告:[deprecation] PackageInfo 中的 versionCode 已被弃用
警告来自此代码:
final PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
int versionCode = info.versionCode;
我查看了documentation,但它没有说明如何解决此问题或应该使用什么来代替已弃用的字段。
【问题讨论】:
另见this previous SO question 【参考方案1】:它说明了要做什么on the Java doc(我建议不要大量使用 Kotlin 文档;它的维护并不好):
版本代码
此字段在 API 级别 28 中已弃用。请改用 getLongVersionCode(),它包括此属性和附加的 versionCodeMajor 属性。此包的版本号,由标记的 versionCode 属性指定。
不过,这是一种 API 28 方法,因此请考虑使用 PackageInfoCompat。它有一个静态方法:
getLongVersionCode(PackageInfo info)
【讨论】:
另见this SO question【参考方案2】:我推荐的解决方案:
将其包含在您的主 build.gradle 中:
implementation 'androidx.appcompat:appcompat:1.0.2'
然后只需使用以下代码:
PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
long longVersionCode= PackageInfoCompat.getLongVersionCode(pInfo);
int versionCode = (int) longVersionCode; // avoid huge version numbers and you will be ok
如果您在添加 appcompat 库时遇到问题,请使用此替代解决方案:
final PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
int versionCode;
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
versionCode = (int) pInfo.getLongVersionCode(); // avoid huge version numbers and you will be ok
else
//noinspection deprecation
versionCode = pInfo.versionCode;
【讨论】:
为什么谷歌必须自己把最平庸的东西变成一门科学? 完美谢谢你的解决方案,@Chuck 你是对的......火箭科学的 int......【参考方案3】:对于使用 Xamarin 的其他人,我的回答是:
public long GetBuild()
var context = global::Android.App.Application.Context;
PackageManager manager = context.PackageManager;
PackageInfo info = manager.GetPackageInfo(context.PackageName, 0);
return info.LongVersionCode;
【讨论】:
请注意,您还可以通过包装此代码并检查 SDK 版本来支持较旧的 SDK:if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.P)
这是一个不长的 Int!
不,这不是 @user1034912 。它甚至在变量名“longVersionCode”而不是旧的“版本代码”中。这实际上是这个问题的重点,它曾经是 int,然后变成了 long。【参考方案4】:
这里是kotlin
中的解决方案:
val versionCode: Long =
if (Build.VERSION.SDK_INT >= VERSION_CODES.P)
packageManager.getPackageInfo(packageName, 0).longVersionCode
else
packageManager.getPackageInfo(packageName, 0).versionCode.toLong()
【讨论】:
这是错误的。 longVersionCode 里面有这个 if else 。 @PedroRomão 没错。longVersionCode
仅 API 级别 28+。以上是关于Android SDK 28 - PackageInfo 中的 versionCode 已被弃用的主要内容,如果未能解决你的问题,请参考以下文章
Android SDK 28 - PackageInfo 中的 versionCode 已被弃用
忽略指定的Android SDK Build Tools版本(28.0.2)
Flutter Android SDK 版本 28 错误,但我使用的是 30
指定的 Android SDK Build Tools 版本 (28.0.2) 被忽略
License for package Android SDK Build-Tools 28.0.3 not accepted.