FusedLocationProviderClient.requestLocationUpdates在安卓模拟器上无法触发回调的问题排查与解决
安卓模拟器中FusedLocationProviderClient.requestLocationUpdates不触发LocationCallback的问题解决
我之前也踩过这个坑,模拟器的GPS模拟逻辑和真机确实不一样,咱们一步步来排查解决:
常见原因及解决方法
1. 模拟器未注入GPS模拟数据(最常见原因)
安卓模拟器默认不会主动生成GPS数据,必须手动给它喂数据才行:
- 打开模拟器右侧的扩展控制面板(那个三个点的按钮),切换到
Location标签页 - 可以直接输入经纬度坐标,点击
SEND发送模拟位置;也可以导入GPX/KML文件模拟移动路径 - 另外要确保模拟器的开发者选项里,「允许模拟位置」已经开启(找不到开发者选项的话,去关于手机里连续点击版本号几次就能调出)
2. LocationRequest参数设置不合理
如果你的LocationRequest参数要求太高,模拟器可能没法满足:
- 比如设置了
PRIORITY_HIGH_ACCURACY但模拟器的GPS模拟精度跟不上,可以先改成PRIORITY_BALANCED_POWER_ACCURACY测试 - 把
interval(更新间隔)设短一点,比如1000ms,fastestInterval设500ms,让模拟器有足够的响应时间 - 给你个参考的LocationRequest配置:
LocationRequest locationRequest = LocationRequest.create(); locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); locationRequest.setInterval(1000); locationRequest.setFastestInterval(500); locationRequest.setNumUpdates(1); // 只请求一次更新(如果你的需求是单次定位的话)
3. 权限或定位模式未正确配置
虽然你提到SplashActivity已经申请了权限,但模拟器偶尔会出现权限重置的情况:
- 去模拟器的「设置-应用-你的应用-权限」里,确认位置权限是「允许使用期间访问」或「始终允许」,且开启了「精确位置」(FusedLocation需要这个才能获取高精度定位)
- 把模拟器的系统定位模式设置为「高精确度」(设置-位置-定位模式)
4. Google Play Services版本兼容问题
FusedLocationProviderClient依赖Google Play Services,如果模拟器里的版本太低,可能会出现兼容性问题:
- 打开模拟器里的Google Play商店,检查是否有Google Play Services的更新,升级到最新版本再测试
5. 代码里的小细节问题
看了你提供的代码,有个小细节可以先调整测试:
你在onLocationResult里直接调用了removeLocationUpdates(lcb),如果模拟器第一次没成功触发回调,后续就再也没机会接收更新了。可以先把这行注释掉,等确认能收到回调后再加回去,避免因为第一次失败就终止监听。
测试步骤建议
- 先按照第一步给模拟器注入GPS坐标,再运行代码
- 调整LocationRequest参数为上面的参考配置
- 确认权限和定位模式都正确
- 检查Google Play Services版本
这样一步步排查,应该就能解决模拟器里LocationCallback不触发的问题了。
内容的提问来源于stack exchange,提问作者codingRookie
相关产品推荐
相关产品推荐

