Android中LocationRequest.Builder传入requestLocationUpdates()报错问题咨询
LocationRequest.Builder替代废弃方法后调用requestLocationUpdates报错的解决办法
常见问题及修复方案
1. 依赖版本不兼容
LocationRequest.Builder是Google Play Services Location库19.0.0版本才引入的,如果你的项目依赖版本低于这个,必然会报错。
修复:
在Module级别的build.gradle中更新依赖到最新稳定版:
dependencies { implementation 'com.google.android.gms:play-services-location:21.0.1' }
2. API版本适配问题
你代码里用了@RequiresApi(api = Build.VERSION_CODES.S),但LocationRequest.Builder(long interval)是Android 12(API31)系统级的构造方法,兼容性差。换成兼容低版本的构造方法(基于Play Services库)更稳妥:
修改后的LocationRequest构建代码:
// 替换原来的locationRequest构建代码 locationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000).build();
这个写法在Play Services Location 19.0.0+支持,不需要强制依赖Android 12系统。
3. 权限未校验
调用位置更新前必须确保已获取对应权限,否则会触发权限异常:
添加权限校验逻辑:
在调用setUpLocationUpdate()前加入以下代码:
if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 发起权限请求 registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { setUpLocationUpdate(); } }).launch(Manifest.permission.ACCESS_FINE_LOCATION); return; }
如果需要后台位置更新,还要额外申请ACCESS_BACKGROUND_LOCATION权限(Android 10+)。
4. FusedLocationProviderClient未初始化
检查是否在合适的时机初始化了fusedLocationProviderClient,比如在onViewCreated或onCreate中:
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(requireContext()); }
修正后的完整代码示例
private boolean isLocationpermissionOk; private LocationRequest locationRequest; private LocationCallback locationCallback; private FusedLocationProviderClient fusedLocationProviderClient; @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(requireContext()); checkPermissionAndStartLocationUpdate(); } private void checkPermissionAndStartLocationUpdate() { if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { if (isGranted) { setUpLocationUpdate(); } }).launch(Manifest.permission.ACCESS_FINE_LOCATION); return; } setUpLocationUpdate(); } private void setUpLocationUpdate() { // 兼容多版本的LocationRequest构建方式 locationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000).build(); locationCallback = new LocationCallback() { @Override public void onLocationResult(@NonNull LocationResult locationResult) { if (locationResult != null) { for (Location location : locationResult.getLocations()) { Log.d("TAG", "onLocationResult: " + location.getLongitude() + " " + location.getLatitude()); } } super.onLocationResult(locationResult); } }; fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()) .addOnCompleteListener(task -> { if (task.isSuccessful()) { Toast.makeText(requireContext(), "位置更新已启动", Toast.LENGTH_SHORT).show(); } }); }
内容的提问来源于stack exchange,提问作者ayna khan
相关产品推荐
相关产品推荐

