Android 14 中的 PendingIntent 标志更改

PendingIntent flag changes in Android 14

提问人:martin1337 提问时间:11/16/2023 最后编辑:martin1337 更新时间:11/17/2023 访问量:50

问:

我想在应用程序中为我的通知注册 PendingIntent(它们用作带有倒计时的小部件或确切时间的警报声音,可以根据状态更新或取消)。

这是我到目前为止使用的代码:

val alarmPendingIntentFlag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE){
//WHAT TO DO HERE
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){
  PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
} else { PendingIntent.FLAG_UPDATE_CURRENT }
alarmPendingIntent = PendingIntent.getBroadcast(this, 0,Intent(ALARM_ACTION), alarmPendingIntentFlag)

registerReceiver(alarmReceiver, IntentFilter(ALARM_ACTION))

我不得不为 Android 11+ 更改它

PendingIntent.FLAG_UPDATE_CURRENT自。PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT

现在我又遇到了 Android 14 的问题。

以 U+(版本 34 及更高版本)为目标不允许创建或检索 带有 FLAG_MUTABLE 的 PendingIntent,内部和外部的隐式 Intent FLAG_NO_CREATE和FLAG_ALLOW_UNSAFE_IMPLICIT_INTENT安全 原因。要检索已存在的 PendingIntent,请使用 但是,FLAG_NO_CREATE创建一个新的 PendingIntent,其中包含 隐式 Intent 使用FLAG_IMMUTABLE。

那么,如何为 Android 14 更新此功能,以便在需要更新时使用新数据更新意图的当前功能?

有但不确定这是否是可行的方法。PendingIntent.FLAG_ALLOW_UNSAFE_IMPLICIT_INTENT

android-intent android-pendingintent

评论

0赞 Darush 12/20/2023
如果你绝对需要使用可变标志,你可能会发现这个答案很有帮助: stackoverflow.com/a/77691101/4726718

答:

0赞 David Wasser 11/17/2023 #1

您不需要使用 .您可以放心使用 .您无需使用即可替换(通过)中的“额外内容”。PendingIntent.FLAG_MUTABLEPendingIntent.FLAG_IMMUTABLEFLAG_MUTABLEPendingIntentPendingIntent.UPDATE_CURRENT

FLAG_MUTABLE仅当 由您传递给其他应用程序的 包装 允许由该应用程序修改时(通常通过添加“额外”、数据等),当其他应用程序实际发送 .请参阅 PendingIntent.send() 和 Intent.fillin() 的文档IntentPendingIntentIntent

0赞 Doron Ben-Ari 11/29/2023 #2

在不改变任何逻辑的情况下,最简单的方法是将意图从隐式更改为显式。
您不能指定类名来实现这一点,因为这不适用于动态注册的接收器。
所以,简单地做

...
val intent = Intent(ALARM_ACTION)
intent.`package` = packageName
alarmPendingIntent = PendingIntent.getBroadcast(this, 0, intent, alarmPendingIntentFlag)
...

(packageName 是 ContextWrapper 的属性,因此是 Activity 的属性)