Android SDK 28 - PackageInfo 中的版本代码已被弃用

我刚刚将我的应用程序升级到(Pie)。compileSdkVersion28

我收到编译警告:

警告:[弃用] PackageInfo 中的版本代码已被弃用

警告来自以下代码:

final PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
int versionCode = info.versionCode;

我查看了文档,但它没有说明如何解决此问题或应该使用什么而不是已弃用的字段。


答案 1

它说明了在Java文档上该怎么做(我建议不要使用Kotlin文档;它并没有真正得到很好的维护):

版本代码

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

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

getLongVersionCode(PackageInfo info)

答案 2

我推荐的解决方案:

将其包含在您的主构建中。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

如果您在添加应用程序兼容库时遇到问题,请直接使用此替代解决方案

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;
}

推荐