43

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

我收到编译警告:

警告:PackageInfo 中的 [deprecation] versionCode 已被弃用

警告来自以下代码:

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

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

4

4 回答 4

59

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

版本代码

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

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

getLongVersionCode(PackageInfo info)
于 2018-10-24T20:03:19.840 回答
43

我推荐的解决方案:

将此包含在您的主要 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;
}
于 2018-12-15T23:37:07.510 回答
10

仅对于使用 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;
}
于 2020-06-12T14:03:03.250 回答
5

这里的解决方案kotlin

val versionCode: Long =
    if (Build.VERSION.SDK_INT >= VERSION_CODES.P) {
           packageManager.getPackageInfo(packageName, 0).longVersionCode
    } else {
            packageManager.getPackageInfo(packageName, 0).versionCode.toLong()
    }
于 2019-08-14T15:44:49.770 回答