Android 12/API 31中Geofence搭配IMMUTABLE PendingIntent异常咨询
Android 12 (API 31) Geofence搭配PendingIntent标识问题解答
问题1:使用FLAG_IMMUTABLE标识后无法获取触发Geofence列表的原因
- Geofence触发事件由Google Play服务的定位模块发出,该模块需要向你创建的PendingIntent关联的Intent对象中写入额外数据,包括触发的Geofence列表、过渡类型、触发精度等参数。
FLAG_IMMUTABLE的作用是禁止其他应用修改PendingIntent所携带的Intent内容,即便系统进程写入的额外数据也会被拦截,导致你在广播接收器中拿到的Intent不包含Geofence相关的附加字段,调用geofencingEvent.getTriggeringGeofences()自然返回null。
问题2:配置合理性与标识选型说明
- 不属于配置错误,该场景不支持使用
FLAG_IMMUTABLE。 - 官方通用Javadoc建议优先使用
FLAG_IMMUTABLE是针对不需要修改Intent的通用场景,而Geofence触发属于典型的依赖第三方修改底层Intent的场景,和inline reply、bubbles属于同一类需要FLAG_MUTABLE的场景,同时Google官方定位开发文档也明确要求,Geofence、活动识别等定位触发类功能使用的PendingIntent必须指定FLAG_MUTABLE才能正常工作。
兼容不同系统版本的正确代码示例
int pendingFlag = PendingIntent.FLAG_NO_CREATE; // API 31及以上必须显式指定MUTABLE标识 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) { pendingFlag |= PendingIntent.FLAG_MUTABLE; } PendingIntent proximityIntent = PendingIntent.getBroadcast(context, requestCode, intent, pendingFlag);
内容的提问来源于stack exchange,提问作者Mathias
相关产品推荐
相关产品推荐

