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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 06:45:03