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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:31:14