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

FusedLocationProviderApi废弃后,如何结合LocationListener实现FusedLocationProviderClient

嘿,我来帮你搞定FusedLocationProviderApi迁移的问题,分两部分给你讲清楚~

问题1:保留LocationListener的前提下实现FusedLocationProviderClient

其实新的FusedLocationProviderClient比旧API简单太多,完全不需要依赖GoogleApiClient和ConnectionCallback那一套,直接就能和LocationListener配合使用,步骤如下:

  • 第一步:初始化FusedLocationProviderClient
    在Activity或Fragment里直接初始化,不需要处理复杂的连接逻辑:

    private FusedLocationProviderClient fusedLocationProviderClient;
    
    // 在onCreate或初始化方法里
    fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
    
  • 第二步:配置LocationRequest
    定义你需要的位置更新参数,比如更新间隔、精度优先级:

    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setInterval(10000); // 10秒更新一次
    locationRequest.setFastestInterval(5000); // 最快5秒更新(应对高频率需求)
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // 高精度模式,适合订单追踪
    
  • 第三步:关联LocationListener并发起请求
    直接调用client的requestLocationUpdates方法,传入你的LocationListener即可,记得先检查权限:

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationListener, Looper.getMainLooper());
    }
    
  • 第四步:生命周期清理
    记得在Activity的onPause或onDestroy里移除位置更新,避免资源浪费:

    @Override
    protected void onPause() {
        super.onPause();
        fusedLocationProviderClient.removeLocationUpdates(locationListener);
    }
    

这样你的LocationListener就能正常接收位置回调,核心逻辑完全不用改~


问题2:适配订单追踪类的onCreate方法

针对你之前基于GoogleApiClient的实现,我们直接替换掉废弃组件,下面是修改后的完整示例,包含权限处理和位置请求逻辑:

private FusedLocationProviderClient fusedLocationProviderClient;
private LocationListener locationListener;

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

    // 1. 初始化FusedLocationProviderClient
    fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);

    // 2. 保留你的LocationListener核心逻辑(处理订单起点追踪)
    locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(@NonNull Location location) {
            // 这里处理获取到的位置,比如保存订单起点坐标
            double startLat = location.getLatitude();
            double startLng = location.getLongitude();
            // 你的订单业务逻辑...比如上传起点到服务器
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // 可选:处理GPS状态变化,比如提示用户打开定位
        }

        @Override
        public void onProviderEnabled(@NonNull String provider) {
            // 可选:定位提供者启用时的逻辑
        }

        @Override
        public void onProviderDisabled(@NonNull String provider) {
            Toast.makeText(OrderTrackingActivity.this, "请打开定位权限以追踪订单起点", Toast.LENGTH_SHORT).show();
        }
    };

    // 3. 检查并申请位置权限(用AndroidX规范的方式)
    requestLocationPermissions();
}

// 权限申请逻辑(替代旧的requestPermissions)
private void requestLocationPermissions() {
    String[] requiredPermissions = {Manifest.permission.ACCESS_FINE_LOCATION};
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityResultLauncher<String[]> permissionLauncher = registerForActivityResult(
                new ActivityResultContracts.RequestMultiplePermissions(),
                permissionResults -> {
                    Boolean isGranted = permissionResults.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false);
                    if (isGranted) {
                        // 权限通过,开始请求位置更新
                        startLocationTracking();
                    } else {
                        Toast.makeText(this, "需要定位权限才能完成订单起点追踪", Toast.LENGTH_LONG).show();
                    }
                }
        );
        permissionLauncher.launch(requiredPermissions);
    } else {
        // 已有权限,直接启动追踪
        startLocationTracking();
    }
}

// 启动位置更新的方法
private void startLocationTracking() {
    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setInterval(8000); // 订单追踪可以适当缩短间隔
    locationRequest.setFastestInterval(4000);
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    try {
        fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationListener, Looper.getMainLooper());
    } catch (SecurityException e) {
        // 捕获权限异常,避免崩溃
        e.printStackTrace();
    }
}

// 生命周期清理,避免内存泄漏
@Override
protected void onDestroy() {
    super.onDestroy();
    if (fusedLocationProviderClient != null && locationListener != null) {
        fusedLocationProviderClient.removeLocationUpdates(locationListener);
    }
}

关键变化说明:

  • 彻底移除了GoogleApiClient、ConnectionCallback等废弃组件
  • 用FusedLocationProviderClient统一处理所有位置请求逻辑
  • 采用AndroidX的ActivityResultContracts处理权限申请,更符合现代Android开发规范
  • 你的LocationListener核心业务逻辑完全保留,不需要修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:43:38