Android获取位置写入EditText,FusedLocationProvider及Location实例报错如何解决
问题1:FusedLocationProviderClient 上下文参数异常排查
- 该方法入参仅要求传入有效
Context实例,不存在必须传MainActivity.this的强制要求,根据你的代码所在场景选择即可:- 代码写在
Fragment中:优先用requireContext()替代getActivity(),避免Fragment解绑时返回空指针,调用前可加判空逻辑校验Context有效性 - 代码写在
Activity内部:直接传入MainActivity.this即可,不生效优先检查依赖配置:确认模块build.gradle中已正确引入com.google.android.gms:play-services-location依赖,版本与项目内其他Google服务依赖保持一致,避免类加载冲突
- 代码写在
- 额外检查项:确认已动态申请
ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION位置权限,无权限调用位置接口会直接抛出异常;同时校验locationRequest已正确配置优先级、更新间隔等核心参数。
问题2:Location构造方法入参问题修复
Location类构造方法的入参是位置提供者的标记字符串,不属于系统服务常量,你的两种写法都不符合要求,且存在冗余逻辑:
- 完全不需要自行构造
Location实例,locationResult.getLocations().get(latestLocationIndex)已经返回了可用的Location对象,直接传入fetchAddress即可 - 如必须自行构造,入参可随意填写标记字符串(如
"fused"),该参数仅做来源标记,不影响经纬度赋值和后续地址解析 - 现有逻辑错误:
fetchAddress为异步操作,你调用后立刻为EditText赋值的时机错误,此时address还未完成赋值,需要将赋值逻辑放到fetchAddress的结果回调中执行
修正后参考代码
// 位置权限校验,无权限先申请权限再执行后续逻辑 if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 自行补充权限申请逻辑,申请通过后再调用位置接口 return; } // 传入正确Context,Fragment用requireContext(),Activity替换为MainActivity.this即可 LocationServices.getFusedLocationProviderClient(requireContext()) .requestLocationUpdates(locationRequest, new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { super.onLocationResult(locationResult); LocationServices.getFusedLocationProviderClient(requireContext()).removeLocationUpdates(this); if (locationResult != null && !locationResult.getLocations().isEmpty()) { // 直接获取返回的位置实例,无需自行构造 Location latestLocation = locationResult.getLastLocation(); // 改造fetchAddress增加回调,地址解析完成后再赋值 fetchAddress(latestLocation, new AddressFetchCallback() { @Override public void onFetchSuccess(String addressResult) { location.setText(addressResult); } @Override public void onFetchFail() { location.setText("地址解析失败"); } }); } } }, Looper.getMainLooper());
内容的提问来源于stack exchange,提问作者FanFiniFinFon
相关产品推荐
相关产品推荐

