Android使用Activity Recognition采样API时extractResult返回null
问题排查方案
1. 权限配置排查
- 首先确认AndroidManifest中已正确声明活动识别权限:Android 10(API 29)及以上需要
android.permission.ACTIVITY_RECOGNITION,且必须动态申请,仅清单声明无效;API 28及以下需要com.google.android.gms.permission.ACTIVITY_RECOGNITION。 - 检查JobIntentService的声明是否正确,必须添加
android:permission="android.permission.BIND_JOB_SERVICE"属性,否则服务无法正常接收系统回调的Intent。
2. PendingIntent配置排查
- 你创建用于注册活动识别回调的PendingIntent必须和启动JobIntentService的Intent完全匹配:
- 确保PendingIntent使用的ComponentName明确指向你的JobIntentService实现类,不要用隐式Intent,Android 8.0及以上隐式Intent无法唤醒后台服务。
- 检查PendingIntent的flag配置:Android 12及以上必须使用
PendingIntent.FLAG_MUTABLE,如果设置了FLAG_IMMUTABLE会导致系统无法修改Intent携带的识别结果数据,最终extractResult返回null。
3. 服务端接收逻辑排查
- 调用
ActivityRecognitionResult.extractResult(intent)前先判断Intent是否携带对应extra:可以先调用intent.hasExtra(ActivityRecognitionResult.EXTRA_ACTIVITY_RESULT)确认数据存在,避免空意图调用方法返回null。 - JobIntentService的
onHandleWork方法中不要提前清空Intent的extra数据,也不要对Intent做修改操作,直接传入extractResult方法即可。
4. 依赖版本排查
- 确认应用级build.gradle中Activity Recognition依赖版本正确,建议使用稳定版:
过高或过低的版本都可能存在和当前系统GMS服务不兼容的问题,导致回调数据为空。dependencies { implementation 'com.google.android.gms:play-services-location:21.0.1' }
5. 后台运行限制排查
- 部分国产定制ROM会限制应用后台活动采集权限,需要在系统设置中手动开启应用的「身体活动权限」、「后台活动权限」,禁止电池优化,否则系统会拦截活动识别回调数据,导致Intent为空。
内容的提问来源于stack exchange,提问作者Sanyam Saini
相关产品推荐
相关产品推荐

