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】:

我推荐的解决方案:

将其包含在您的主 bu​​ild.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如何下载?

忽略指定的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.