定位 S+(版本 10000 及以上)需要在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一

Ada*_*ner 4 android android-studio

尝试将我的应用程序更新到 Android S 并遇到标题/错误所说的一些问题。我收到错误

针对 S+(版本 10000 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一。强烈考虑使用 FLAG_IMMUTABLE,仅当某些功能依赖于 PendingIntent 是可变的时才使用 FLAG_MUTABLE,例如,如果它需要与内联回复或气泡一起使用。

我的代码中只有 1 个 PendingIntent 用于通知,并且我添加了 Flag

PendingIntent.getActivity(
      mContext,
      0 /* Request code */,
      intentOptional.get(),
      PendingIntent.FLAG_IMMUTABLE
    )
Run Code Online (Sandbox Code Playgroud)

阅读 Google 的文档,这应该是我在 Android S 中进行此安全更新所需的全部内容。我确实在这里找到了几个月前的帖子,询问了类似的问题,有人说要添加 WorkManager /sf/answers/4702709721/ 4219444进入项目,即使你不使用它。所以我加了

def work_version = "2.7.0-alpha04" 
implementation "androidx.work:work-runtime-ktx:$work_version"
Run Code Online (Sandbox Code Playgroud)

这根本没有帮助,因为我仍然收到错误。有谁知道这是 Android S 升级的常见问题还是它也检查库?卡住了,因为应用程序只是不断崩溃,不知道该怎么做。

我创建了一个没有我的库的应用程序,并使用了相同的 PendingIntent,并且能够运行一个带有待处理意图的基本 hello world 应用程序。我从我试图编译的项目中收到的完整错误是:

针对 S+(版本 10000 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一。强烈考虑使用 FLAG_IMMUTABLE,仅当某些功能依赖于 PendingIntent 是可变的时才使用 FLAG_MUTABLE,例如,如果它需要与内联回复或气泡一起使用。在 android.app.PendingIntent.checkFlags(PendingIntent.java:375) 在 android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:645) 在 android.app.PendingIntent.getBroadcast(PendingIntent.java:632) 在 com.google。 android.gms.internal.gtm.zzbv.zzfe(未知来源:52)在 com.google.android.gms.internal.gtm.zzbv.cancel(未知来源:54)在 com.google.android.gms.internal。 gtm.zzbv.zzaw(未知来源:4)位于 com.google.android.gms.internal.gtm.zzan.zzag(未知来源:7)位于 com.google.android.gms.internal.gtm.zzap。(未知)来源:

Saa*_*aat 44

根据文档,“强烈建议在创建 PendingIntent 时使用 FLAG_IMMUTABLE。仅当某些功能依赖于修改底层意图时才应使用 FLAG_MUTABLE,例如需要与内联回复或气泡一起使用的任何 PendingIntent。”

所以用这个PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT

而不仅仅是PendingIntent.FLAG_UPDATE_CURRENT

例如PendingIntent.getActivity(context, yourRequestID, yourIntent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT)

因为“即使设置了 FLAG_IMMUTABLE,FLAG_UPDATE_CURRENT 仍然有效”

如果错误仍然存​​在,并且您的 targetSdkVersion = 31,那么该错误一定是由于您的依赖项之一在内部使用 WorkManager 或者您直接使用旧版本的 WorkManager 引起的。

要解决此问题,只需添加此依赖项

implementation 'androidx.work:work-runtime-ktx:2.7.0'
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是文档中缺少的内容:在“RemoveViews”上使用“setPendingIntentTemplate”时,您还需要“FLAG_MUTABLE”(例如用于检测小部件列表项上的单击事件)。 (2认同)

小智 25

添加您的待处理意图,如下所示:

 PendingIntent.getActivity(getApplicationContext(), 0, intent,PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT)
Run Code Online (Sandbox Code Playgroud)


Nic*_*ick 17

阅读完这里的答案后,我在 Android 的网站上发现了这一点:

注意:针对 Android 12 (S) 的应用程序需要 WorkManager 版本 2.7.0。

https://developer.android.com/jetpack/androidx/releases/work

所以添加这个依赖就可以让它工作了。

 def work_version = "2.7.0"

// (Java only)
implementation "androidx.work:work-runtime:$work_version"

// Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version"
Run Code Online (Sandbox Code Playgroud)


jom*_*rge 5

它是通过添加解决的

implementation 'androidx.work:work-runtime:2.7.0-alpha05'
Run Code Online (Sandbox Code Playgroud)

在我的毕业典礼上。

似乎这是工作管理器中的错误。检查版本 2.7.0-alpha02 中的错误修复

https://developer.android.com/jetpack/androidx/releases/work#2.7.0-alpha02

  • 这应该是公认的答案! (3认同)
  • 我花了一周的时间检查我的代码是否存在标志可能存在的错误,但没有发现任何错误。现在我添加了这一行,一切都按预期进行。为什么谷歌有时让我们的生活如此艰难。他们是否检查过自己的发布,或者为了在截止日期前发布未经检查的代码?无论如何,非常感谢您。你帮我解决了很多头痛问题! (3认同)
  • 这不是一个错误,您在那里看到的错误修复表明他们明确修复了崩溃,因此当前状态是正确的状态。您所指的版本只是 2.7.0 的 alpha 版本,实际版本是在该 alpha 版本之后发布的。所以你所做的实际上是一种回归。您可以只使用“PendingIntent.FLAG_IMMUTABLE 或 PendingIntent.FLAG_UPDATE_CURRENT” (2认同)

Mor*_*ori 5

有两个步骤

1-添加androidx.work错误消息中显示的内容

dependencies {
    implementation 'androidx.work:work-runtime-ktx:2.7.1'}
Run Code Online (Sandbox Code Playgroud)

2-PendingIntent由 Chang 修复或添加FLAG_IMMUTABLE

PendingIntent pendingIntent =
                PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
    
Run Code Online (Sandbox Code Playgroud)

  • 你好!我需要在哪里添加这个 PendingIntent ?多谢 (2认同)

Ada*_*ner 1

因此,为了通过 Android S 更新解决这个问题,我花了一些时间完全删除 Google Analytics,并将其替换为 Firebase Analytics 和 Crashlytics。

我不完全确定这是否是因为 Google 尚未/不会更新 Android S 的 Google Analytics 或其他原因。