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

实现LocationListener时onLocationChanged引用歧义问题求助

问题解决与替代方案

一、解决onLocationChanged调用歧义问题

错误核心原因:API 30(Android 11)及以上版本中,LocationListener接口新增了默认方法onLocationChanged(List<Location>),与旧版onLocationChanged(Location)方法形成重载,导致调用this.onLocationChanged(null)时编译器无法匹配目标方法。

无需降级SDK的修复方案:

  • 明确指定参数类型,强制调用单Location参数的方法:
    this.onLocationChanged((Location) null);
    
  • 显式重写两个重载方法,确保方法签名清晰(按需实现):
    @Override
    public void onLocationChanged(Location location) {
        // 处理单位置更新逻辑,比如计算速度
        if (location != null) {
            float speed = location.getSpeed(); // 单位:m/s,转km/h需乘以3.6
        }
    }
    
    @Override
    public void onLocationChanged(List<Location> locations) {
        // 处理批量位置更新(可选)
        if (!locations.isEmpty()) {
            onLocationChanged(locations.get(0));
        }
    }
    

二、解决降级SDK后的库编译错误

降级compileSdk到29引发库错误的本质是:项目依赖(如AppCompat、Material等)的版本与compileSdk版本不兼容。优先建议不降级SDK,采用上述方法修复歧义问题即可。若必须降级:

  • 同步所有依赖库版本到与compileSdk 29兼容的版本,示例如下:
    dependencies {
        implementation 'androidx.appcompat:appcompat:1.2.0'
        implementation 'com.google.android.material:material:1.3.0'
        // 其他依赖需对应降级到兼容版本
    }
    

三、速度计实现的官方推荐替代方案

Google已不再推荐直接使用LocationManager,建议采用Fused Location Provider API,该API更省电、稳定,且适配最新Android版本:

1. 添加依赖

在Module级别的build.gradle中引入:

implementation 'com.google.android.gms:play-services-location:21.0.1'

2. 核心代码示例

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;

private FusedLocationProviderClient fusedLocationClient;
private LocationCallback locationCallback;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

    // 配置位置请求参数
    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setInterval(1000); // 位置更新间隔(毫秒)
    locationRequest.setFastestInterval(500); // 最快更新间隔
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // 高精度模式

    // 定义位置更新回调
    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) return;
            for (Location location : locationResult.getLocations()) {
                // 计算并获取速度(单位:km/h)
                float speedKmH = location.getSpeed() * 3.6f;
                // 更新UI显示速度,示例:textView.setText(String.format("%.1f km/h", speedKmH));
            }
        }
    };

    // 检查权限并启动位置更新
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(this, "First enable LOCATION ACCESS in settings.", Toast.LENGTH_LONG).show();
        return;
    }
    fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper());
}

// 销毁Activity时停止位置更新,避免资源浪费
@Override
protected void onDestroy() {
    super.onDestroy();
    fusedLocationClient.removeLocationUpdates(locationCallback);
}

内容的提问来源于stack exchange,提问作者Subharanjan Nayak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:46:04