web-dev-qa-db-ja.com

Android SDK 28-PackageInfoのversionCodeは廃止されました

アプリのcompileSdkVersion28(Pie)にアップグレードしました。

コンパイルの警告が表示されます:

警告:[非推奨] PackageInfoのversionCodeは非推奨になりました

警告はこのコードから来ています:

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

documentation を見ましたが、この問題を解決する方法や、廃止されたフィールドの代わりに使用すべきものについては何も述べていません。

19

それは何をすべきかを示しています Java doc (私はKotlinのドキュメントをあまり使わないことをお勧めします;それは実際にはうまく維持されていません):

versionCode

このフィールドはAPIレベル28で非推奨になりました。代わりにgetLongVersionCode()を使用します。これには、この属性と追加のversionCodeMajor属性の両方が含まれます。タグのversionCode属性で指定されたこのパッケージのバージョン番号。

ただし、これはAPI 28メソッドなので、 PackageInfoCompat の使用を検討してください。静的メソッドが1つあります。

getLongVersionCode(PackageInfo info)
27
TheWanderer

私の推奨ソリューション:

これをメインの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;
}
22
Blackd

ここで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