Android SDK 28-已弃用PackageInfo中的versionCode

时间:2018-10-24 20:00:08

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

我只是将应用程序的compileSdkVersion升级为28(Pie)。

我收到编译警告:

  

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

警告来自以下代码:

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

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

4 个答案:

答案 0 :(得分:19)

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

  

versionCode

     

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

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

getLongVersionCode(PackageInfo info)

答案 1 :(得分:10)

我推荐的解决方案:

将此包含在您的主build.gradle中:

lib

然后只需使用以下代码:

implementation 'androidx.appcompat:appcompat:1.0.2'

如果您在添加appcompat库时遇到问题,则只需使用此替代解决方案

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

答案 2 :(得分:7)

对于其他使用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;
}

答案 3 :(得分:0)

kotlin 中找到解决方案:

val versionCode: Long =
    if (Build.VERSION.SDK_INT >= VERSION_CODES.P) {
           packageManager.getPackageInfo(packageName, 0).longVersionCode
    } else {
            packageManager.getPackageInfo(packageName, 0).versionCode.toLong()
    }