Android 13 (SDK 33):PackageManager.getPackageInfo(String, int) 已弃用。还有什么选择呢?

Mar*_*rat 62 android android-context package-info

从 API 级别 33 开始,getPackageInfo(String, int)PackageManager 类的方法已被弃用。文档建议改为使用getPackageInfo(String, PackageInfoFlags)。但该功能仅适用于 API 级别 33。

我当前的代码:

val pInfo = context.packageManager.getPackageInfo(context.packageName, 0)
Run Code Online (Sandbox Code Playgroud)

现在应该是这样吗?

val pInfo = context.getPackageInfo()

@Suppress("DEPRECATION")
fun Context.getPackageInfo(): PackageInfo {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        packageManager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(0))
    } else {
        packageManager.getPackageInfo(packageName, 0)
    }
}
Run Code Online (Sandbox Code Playgroud)

mtr*_*kal 59

如果您使用 Kotlin,您可以向您的项目添加扩展功能:

fun PackageManager.getPackageInfoCompat(packageName: String, flags: Int = 0): PackageInfo =
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(flags.toLong()))
    } else {
        @Suppress("DEPRECATION") getPackageInfo(packageName, flags)
    }
Run Code Online (Sandbox Code Playgroud)

packageManager.getPackageInfoCompat(packageName)如果需要的话,只需调用或添加另一个标志即可。

  • 我必须在这里检查 Android 版本吗?如果我使用新的 API,它不是只适用于旧版 Android 吗? (2认同)

Com*_*are 21

现在应该是这样吗?

是的,尽管我已经放弃了使用的做法,TIRAMISU转而支持实际的底层Int.

理想情况下,谷歌会为这些变化添加一些内容PackageManagerCompat,也许他们现在会这样做,因为 Android 13 已经开始向用户提供。

  • 我在“androidx.core”(https://issuetracker.google.com/issues/246845196)中提交了新的“PackageManagerCompat”函数的功能请求。 (17认同)