You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:27:02