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 已被弃用的主要内容,如果未能解决你的问题,请参考以下文章