【发布时间】:2021-12-15 12:06:29
【问题描述】:
所以我有一个带有小部件的应用程序,它在更新小部件或打开应用程序时使用 PendingIntent。将 targetSdkVersion 设置为 31 后,它开始崩溃说
“定位 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一。强烈考虑使用 FLAG_IMMUTABLE,仅当某些功能依赖于 PendingIntent 是可变的时才使用 FLAG_MUTABLE,例如,如果它需要与内联回复或气泡一起使用“
所以我在使用 PendingIntent 的任何地方都这样做了
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
pendingIntent = PendingIntent.getActivity(
context,
0,
intent,
PendingIntent.FLAG_IMMUTABLE
)
} else {
pendingIntent = PendingIntent.getActivity(
context,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT
)
}
但是,这似乎不起作用,并且对于某些用户来说它一直在崩溃并显示在 Firebase Crashlytics 中。有谁知道如何解决这个问题?
【问题讨论】:
-
“对于某些用户来说它一直在崩溃”——它是因为同样的错误还是因为一些新的错误而崩溃?
-
总是我发布的错误以“Targeting S+...”开头。
-
也许
PendingIntent不是来自您的代码,而是来自库。错误或堆栈跟踪是否为您提供了PendingIntent来自何处的任何指示? -
这很好。可能。它说它在打开应用程序后 1 秒内发生,这就是为什么我认为它来自我的小部件,但我想它也可能来自推送通知,所以在这种情况下是 Firebase
-
API 31+ 的新 PendingIntent 缺少原始标志
PendingIntent.FLAG_UPDATE_CURRENT。如果您的 'pre API 31'-PendingIntent 有这个标志,那么除了 IMMUTABLE 标志之外,你的 'API 31+'-PendingIntent 应该有这个标志:PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE- 但是,我不确定这是否是在你的情况下崩溃。
标签: android kotlin widget android-widget