【问题标题】:Android SDK 28 - versionCode in PackageInfo has been deprecatedAndroid SDK 28 - PackageInfo 中的 versionCode 已被弃用
【发布时间】: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,但它没有说明如何解决此问题或应该使用什么来代替已弃用的字段。

【问题讨论】:

标签: java android android-9.0-pie package-info


【解决方案1】:

它说明了要做什么on the Java doc(我建议不要大量使用 Kotlin 文档;它的维护并不好):

版本代码

此字段在 API 级别 28 中已弃用。请改用 getLongVersionCode(),它包括此属性和附加的 versionCodeMajor 属性。此包的版本号,由标记的 versionCode 属性指定。

不过,这是一种 API 28 方法,因此请考虑使用 PackageInfoCompat。它有一个静态方法:

getLongVersionCode(PackageInfo info)

【讨论】:

【解决方案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+。
猜你喜欢
  • 2019-02-28
  • 2019-03-09
  • 2019-07-30
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
相关资源
最近更新 更多