在Android 12/API 31中,Geofence与IMMUTABLE pendingintent不兼容。为什么?

14

PendingIntent中新增了一个FLAG_IMMUTABLE字段。

在31版本中,你必须指定MUTABLE或IMMUTABLE,否则无法创建PendingIntent。(当然我们不能有默认值,那是为失败者准备的)参考这里

根据(滑稽)Google Javadoc文档的建议,你应该基本上总是使用IMMUTABLE(重点是我的):

强烈建议创建PendingIntent时使用FLAG_IMMUTABLE。只有在某些功能依赖于修改基础意图的情况下,才应使用FLAG_MUTABLE,例如任何需要与内联回复或气泡一起使用的PendingIntent(编辑的注释:什么?)。

所以,我一直像这样为Geofence创建PendingIntent:

PendingIntent proximityIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_NO_CREATE)

一直都很正常。 然而,按照上述文档,我像这样添加了IMMUTABLE标志:

PendingIntent proximityIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_NO_CREATE|PendingIntent.FLAG_IMMUTABLE)

现在,由此导致的结果是,虽然我仍然在我的接收器中看到了地理围栏转换,但如果我调用...
List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();

它返回 null!

所以,我有两个问题。

  1. 为什么 IMMUTABLE 标志导致我不像过去那样得到触发的地理围栏?

  2. 我做错了什么吗?是否有一种方法可以使用 Geofence 触发器设置 IMMUTABLE?

实际上,我有三个问题:

  1. 为什么谷歌的文档如此令人困惑、糟糕、自相矛盾且滞后?(这是一个修辞问题)

非常感谢您的指点。

1个回答

24
在这种情况下,地理围栏的挂起意图需要使用FLAG_MUTABLE,而通知挂起意图需要使用FLAG_IMMUTABLE。不幸的是,他们还没有更新面向Android 12的文档代码实验示例。以下是我如何修改代码实验地理围栏示例以使其正常工作。

首先,将gradle更新为目标SDK31。

HuntMainActivity中,更改geofencePendingIntent为:

  private val geofencePendingIntent: PendingIntent by lazy {
    val intent = Intent(this, GeofenceBroadcastReceiver::class.java)
    intent.action = ACTION_GEOFENCE_EVENT
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
      PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE)
    } else {
      PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
    }
  }
NotificationUtils.kt中,将通知的待处理意图更新为以下内容:
  val contentIntent = Intent(context, HuntMainActivity::class.java)
  contentIntent.putExtra(GeofencingConstants.EXTRA_GEOFENCE_INDEX, foundIndex)
  val contentPendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    PendingIntent.getActivity(
      context,
      NOTIFICATION_ID,
      contentIntent,
      PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )
  } else {
    PendingIntent.getActivity(
      context,
      NOTIFICATION_ID,
      contentIntent,
      PendingIntent.FLAG_UPDATE_CURRENT
    )
  }

1
谢谢。不过我不确定为什么会这样...(没有文档也没有帮助) - Mathias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接