使用Google Fused Api检查位置设置时vivo V7出现ApiException 10错误
解决vivo V7上Google Fused Location API checkLocationSettings抛出ApiException 10的问题
这个问题我之前碰到过类似的场景,核心原因大多是vivo的定制ROM(Funtouch OS)对Google Play Services(GMS)做了裁剪或兼容性修改,导致checkLocationSettings这个API在该设备上没有被正确实现——错误码10对应的就是API_NOT_IMPLEMENTED,直白来说就是当前设备平台不支持这个接口。
可能的原因拆解
- vivo V7的系统可能没有预装完整的GMS组件,或者对GMS的位置相关模块做了限制,使得
SettingsClient.checkLocationSettings无法正常调用。 - 虽然你用原生位置提供器测试功能正常,但Fused API的位置设置检查逻辑依赖GMS的特定服务,这部分在vivo设备上被阻断了,和核心位置获取能力是分离的。
- 设备上的Google Play Services版本过低的可能性相对小,毕竟你在其他设备上运行正常。
可行的解决方案
1. 针对异常做降级处理
直接捕获ApiException并判断错误码为10的情况,跳过位置设置检查,直接请求位置更新(既然你已经验证过位置提供器可以正常工作,说明核心位置服务没问题,只是设置检查这一步不支持)。示例代码如下:
mSettingsClient?.checkLocationSettings(mLocationSettingsRequest) ?.addOnSuccessListener { // 位置设置符合要求,正常启动位置更新 startLocationUpdates() } ?.addOnFailureListener { exception -> if (exception is ApiException) { when (exception.statusCode) { LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> { // 常规场景:引导用户修改位置设置 } 10 -> { // 适配vivo V7:跳过检查直接启动位置更新 startLocationUpdates() } else -> { // 其他错误场景处理 } } } }
2. 回退到原生位置状态检查
如果不想依赖Fused API的checkLocationSettings,可以用原生LocationManager手动检查位置服务状态,替代GMS的检查逻辑:
val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager val isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) val isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) if (isGpsEnabled || isNetworkEnabled) { // 位置服务已开启,启动位置更新 startLocationUpdates() } else { // 引导用户跳转到位置设置页面开启服务 val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) startActivity(intent) }
3. 辅助检查GMS完整性
可以引导用户检查设备上的Google Play Services是否为最新版本,或者是否安装了完整的GMS套件。不过vivo部分机型默认没有预装GMS,需要用户手动安装GMS框架,这一步开发者无法强制控制,只能作为辅助提示。
4. 适配vivo系统的特殊设置
有些vivo设备的隐私保护或后台管理规则会阻止GMS访问位置设置信息,可以提示用户检查:
- 应用的位置权限是否完全开启(虽然你测试正常,但再确认下)
- 是否在「i管家」中限制了应用或GMS的后台运行权限
- 是否开启了「隐私空间」等功能,导致位置服务被隔离
内容的提问来源于stack exchange,提问作者darthvish
相关产品推荐
相关产品推荐

