Mat*_*ias 14 android android-pendingintent android-geofence android-12
PendingIntent 中的一个新 PendingIntent 字段是 FLAG_IMMUTABLE。
在31中,你必须指定MUTABLE或IMMUTABLE,否则你无法创建PendingIntent,(当然我们不能有默认值,那是针对失败者的)如此处引用
根据(搞笑的)Google Javadoc for Pendingintent,你基本上应该总是使用 IMMUTABLE (重点是我的):
强烈建议在创建 PendingIntent 时使用 FLAG_IMMUTABLE。仅当某些功能依赖于修改底层意图时才应使用 FLAG_MUTABLE,例如需要与内联回复或气泡一起使用的任何 PendingIntent (编辑评论:什么?)。
是的,所以我总是为地理围栏创建 PendingIntents,如下所示:
PendingIntent proximityIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_NO_CREATE)
Run Code Online (Sandbox Code Playgroud)
一直工作得很好。但是,按照上面的文档,我添加了 IMMUTABLE 标志,如下所示:
PendingIntent proximityIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_NO_CREATE|PendingIntent.FLAG_IMMUTABLE)
Run Code Online (Sandbox Code Playgroud)
现在,结果是,虽然我仍然在接收器中进行地理围栏转换,但如果我调用
List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();
Run Code Online (Sandbox Code Playgroud)
它返回空!
所以,我有两个问题。
为什么 IMMUTABLE 标志导致我没有像过去那样获得触发地理围栏?
难道我做错了什么?有没有办法使用地理围栏触发器设置 IMMUTABLE?
其实我有三个问题:
非常感谢指点。
小智 24
在这种情况下,地理围栏的待处理意图需要使用FLAG_MUTABLE,而通知待处理意图需要使用FLAG_IMMUTABLE。不幸的是,他们没有更新文档或代码实验室示例针对 Android 12 的以下是我如何修改 Codelabs 地理围栏示例以使其正常工作。
首先,将 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)
}
}
Run Code Online (Sandbox Code Playgroud)
在 中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
)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6194 次 |
| 最近记录: |