Android SDK 28 - код версии в PackageInfo устарел

Я просто обновляю приложение compileSdkVersion в 28 (Пирог).

Я получаю предупреждение компиляции:

предупреждение: [устаревшее] versionCode в PackageInfo устарело

Предупреждение исходит из этого кода:

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

Я посмотрел на документацию, но там ничего не говорится о том, как решить эту проблему или что следует использовать вместо устаревшего поля.

7 ответов

Решение

Там написано, что делать на Java-документе (я рекомендую не использовать документацию Kotlin слишком часто; она не очень хорошо поддерживается):

VersionCode

Это поле устарело на уровне API 28. Вместо этого используйте getLongVersionCode(), который включает в себя и этот, и дополнительный атрибут versionCodeMajor. Номер версии этого пакета, указанный в атрибуте тега versionCode.

Однако это метод API 28, поэтому рассмотрите возможность использования PackageInfoCompat. У него есть один статический метод:

getLongVersionCode(PackageInfo info)

Мое рекомендуемое решение:

Включите это в ваш основной 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 >= 28) {
    versionCode = (int) pInfo.getLongVersionCode(); // avoid huge version numbers and you will be ok
} else {
    //noinspection deprecation
    versionCode = pInfo.versionCode;
}

Просто для других, использующих 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;
}

Здесь решение в kotlin:

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

В Kotlin простой код для получения versionCode в PackageInfo

      val packageInfo = this.packageManager.getPackageInfo(this.packageName, 0)
val verCode = PackageInfoCompat.getLongVersionCode(packageInfo).toInt()

По API33, из библиотеки:

      <applicationContext>.run {
    val info =
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) 
            packageManager.getPackageInfo(packageName, 0)
        else packageManager.getPackageInfo(packageName,
            PackageManager.PackageInfoFlags.of(0))
    PackageInfoCompat.getLongVersionCode(info)
}

Из вашего собственного приложения это все еще правильный ответ: /questions/17363905/kak-uznat-nomer-sborki-versii-vashego-android-prilozheniya/17363916#17363916

Также вы можете использовать эту переменную расширения:

      val PackageInfo.versionCodeCompat: Long
    get() = PackageInfoCompat.getLongVersionCode(this)
Другие вопросы по тегам