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
相关产品推荐
相关产品推荐

