Kotlin中FusedLocationProviderClient.removeLocationUpdates总是返回失败问题排查
问题原因与解决方案
核心原因
你当前判断removeLocationUpdates执行结果的逻辑错误:该方法返回的是异步Task对象,你在调用方法后立即同步读取isSuccessful属性时,Task还未完成执行,默认返回false,所以会触发失败日志,这是90%以上同类问题的根因。
其他可能的触发原因
- 同个
LocationCallback对象被多次调用requestLocationUpdates注册,单次移除无法清除所有注册记录 - 调用移除逻辑时
LocationCallback已经被置空,或者位置权限被用户手动回收 - 项目依赖的
play-services-location版本存在已知bug - 注册和移除逻辑在不同进程执行,Callback对象不匹配
修复方案
1. 替换异步结果判断逻辑
移除同步判断isSuccessful的代码,改用Task自带的异步监听器,同时可以拿到具体的错误信息方便排查:
if (mFusedLocationProviderClient != null && mLocationCallback != null) { try { mFusedLocationProviderClient.removeLocationUpdates(mLocationCallback!!) .addOnSuccessListener { Log.d(TAG, "stopMonitoring: removeLocationUpdates successful.") // 移除成功后置空Callback避免重复调用 mLocationCallback = null } .addOnFailureListener { e -> Log.d(TAG, "stopMonitoring: removeLocationUpdates failed: ${e.message}", e) } } catch (exp: SecurityException) { Log.d(TAG, "stopMonitoring: Security exception.", exp) } }
2. 新增注册状态标记避免重复注册
声明全局标记位控制注册逻辑,避免同个Callback多次注册:
// 全局变量 private var isLocationRegistered = false // 注册位置更新的逻辑调整 if (ActivityCompat.checkSelfPermission(mContext,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext,Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { if(mFusedLocationProviderClient != null && !isLocationRegistered) { mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest,mLocationCallback,Looper.getMainLooper()) isLocationRegistered = true Log.d(TAG, "startMonitoring: mFusedLocationProviderClient is registered now.") } else if(isLocationRegistered) { Log.d(TAG, "startMonitoring: location update already registered.") } else { Log.d(TAG, "startMonitoring: mFusedLocationProviderClient is not initialized!") } return } // 移除成功后重置标记位,需添加上文addOnSuccessListener的回调逻辑中 isLocationRegistered = false
3. 升级依赖版本
将项目中的play-services-location依赖升级到最新稳定版,规避已知版本bug:
dependencies { implementation 'com.google.android.gms:play-services-location:21.0.1' }
内容的提问来源于stack exchange,提问作者Itban Saeed
相关产品推荐
相关产品推荐

