使用Flutter Location插件获取位置时如何规避Google提示?
问题根源
这个弹窗并不是你的Flutter应用触发的,而是Google Play Services的Location Services组件自动弹出的。当你的应用请求的定位优先级是「高精度模式」(依赖GPS+网络辅助定位),但系统的「Google Location Accuracy」功能未开启时,Play Services就会弹出这个提示,引导用户开启该功能来提升定位精度——哪怕你已经申请了ACCESS_FINE_LOCATION权限,只要满足这个条件就会触发。
而且这个提示的触发逻辑很“顽固”:只要检测到应用需要网络辅助定位,且当前该功能未开启,就会弹出;哪怕用户之前开启后又手动关闭,再次请求定位时还是会重复出现。
解决方法
要规避这个提示,核心思路是让应用不触发网络辅助定位的需求,也就是强制使用仅GPS的定位模式,这样Play Services就不会认为需要开启「Google Location Accuracy」功能。具体实现步骤如下:
修改定位优先级为「仅设备模式」
在调用getLocation()之前,通过location插件的changeSettings()方法,设置定位优先级为仅使用设备GPS(对应Android的PRIORITY_DEVICE_ONLY)。这样应用只会依赖GPS硬件获取位置,不会请求网络辅助,自然就不会弹出那个提示。代码修改如下:
var location = Location(); // 关键:设置仅使用设备GPS定位,不依赖网络辅助 await location.changeSettings( priority: LocationPriority.deviceOnly, ); try { _currentLocation = await location.getLocation(); } on PlatformException catch (e) { if (e.code == 'PERMISSION_DENIED') { _locationMsg = 'Permission denied'; } else if (e.code == 'LOCATION_UNAVAILABLE') { // 没有GPS信号时,返回你想要的「未知位置」提示 _locationMsg = '未知位置'; } _currentLocation = null; }确保使用最新版location插件
旧版本的插件可能没有LocationPriority.deviceOnly这个参数,建议你在pubspec.yaml中更新插件到最新版本,保证参数可用。备选方案(不推荐)
如果你坚持想要高精度定位但又不想弹出提示,目前没有官方的配置可以直接禁用这个弹窗。因为这是Play Services的系统级行为,第三方应用无法直接干预。所以最稳妥的还是采用第一种方法,牺牲网络辅助定位来避免打扰用户。
内容的提问来源于stack exchange,提问作者anol

