web-dev-qa-db-fra.com

Android SDK 28 - versionCode dans PackageInfo est obsolète

Je viens de mettre à niveau le compileSdkVersion de mon application en 28 (Tarte).

Je reçois un avertissement de compilation:

avertissement: [deprecation] versionCode dans PackageInfo est obsolète

L'avertissement provient de ce code:

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

J'ai consulté documentation , mais il ne dit rien sur la façon de résoudre ce problème ni sur ce qui devrait être utilisé à la place du champ obsolète.

19

Il dit quoi faire sur le Java doc (je recommande de ne pas utiliser la documentation Kotlin trop longtemps; ce n'est pas vraiment bien entretenu):

versionCode

Ce champ était obsolète dans l'API de niveau 28. Utilisez getLongVersionCode () à la place, qui inclut à la fois cet attribut et l'attribut versionCodeMajor supplémentaire. Le numéro de version de ce package, tel que spécifié par l'attribut versionCode de la balise.

Ceci est une méthode API 28, cependant, pensez donc à utiliser PackageInfoCompat . Il a une méthode statique:

getLongVersionCode(PackageInfo info)
27
TheWanderer

Ma solution recommandée:

Incluez ceci dans votre build.gradle principal:

implementation 'androidx.appcompat:appcompat:1.0.2'

alors utilisez simplement ce code:

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

Si vous avez des problèmes pour ajouter la bibliothèque appcompat, utilisez simplement ceci solution alternative:

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

Voici la solution en kotlin:

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