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

使用FusedLocationClient获取位置时遇权限缺失及方法解析错误问题求助

解决Android FusedLocationProviderClient的两个常见问题

我来帮你搞定这两个定位开发里的常见坑点:


问题1:权限缺失错误

你虽然在AndroidManifest.xml里声明了定位权限,但从Android 6.0(API 23)开始,定位这类危险权限需要动态申请——只靠静态声明系统不会自动授予,必须在运行时主动向用户请求。

解决步骤:

  1. 先添加权限检查与申请逻辑:
    // 在Fragment里定义权限请求码
    private static final int REQUEST_LOCATION_PERMISSION = 1001;
    
    private void checkAndRequestLocationPermission() {
        // 检查是否已获得精确定位权限
        if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            // 未授权则发起申请
            requestPermissions(
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    REQUEST_LOCATION_PERMISSION
            );
        } else {
            // 已授权,直接执行获取位置逻辑
            fetchLastKnownLocation();
        }
    }
    
  2. 重写权限回调方法,处理用户的授权结果:
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_LOCATION_PERMISSION) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 用户同意授权,开始获取位置
                fetchLastKnownLocation();
            } else {
                // 用户拒绝授权,可提示用户开启权限
                Toast.makeText(requireContext(), "需要定位权限才能获取位置信息", Toast.LENGTH_SHORT).show();
            }
        }
    }
    

问题2:无法解析addOnSuccessListener方法

这个问题是因为你给方法传的第一个参数是this(当前Fragment实例),但该重载方法需要的是Activity类型的参数——Fragment本身不是Activity,所以得传入它关联的Activity对象。

修改获取位置的代码:

把原来的获取位置逻辑封装到fetchLastKnownLocation()方法里,并修正参数:

private void fetchLastKnownLocation() {
    // 用requireActivity()代替getContext(),确保Activity不为null
    fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireActivity());
    fusedLocationClient.getLastLocation()
        // 把第一个参数从this换成requireActivity()
        .addOnSuccessListener(requireActivity(), new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                if (location != null) {
                    longText.setText("Longitude: " + location.getLongitude());
                    latText.setText("latitude: " + location.getLatitude());
                } else {
                    // 处理位置为null的情况(比如用户关闭了定位服务)
                    Toast.makeText(requireContext(), "无法获取当前位置,请检查定位设置", Toast.LENGTH_SHORT).show();
                }
            }
        });
}

最后补充:

在你的Fragment的onViewCreated()里,调用checkAndRequestLocationPermission()来触发整个流程,而不是直接调用获取位置的代码。另外,如果你的App需要适配Android 10及以上版本的后台定位,还需要额外声明ACCESS_BACKGROUND_LOCATION权限并动态申请。

内容的提问来源于stack exchange,提问作者maxet24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:37:40