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

Android Studio开发未打开谷歌地图无法获取位置问题咨询

问题原因
  • 你调用的FusedLocationProviderClient.getLastLocation()方法仅读取系统缓存的最近定位结果,谷歌官方明确说明该方法有概率返回null,常见触发场景包括:
    • 设备重启后还没有任何应用发起过定位请求,系统定位缓存为空
    • 原有缓存的定位结果已过期,被系统自动清理
  • 你打开谷歌地球后,谷歌地球会主动发起新的实时定位请求,生成的最新定位结果会存入系统缓存,此时再回到你的应用调用getLastLocation就能读到缓存结果,因此功能恢复正常。
代码问题

你当前的代码仅处理了定位结果非空的逻辑,返回null时只打了日志没有兜底逻辑,也没有主动发起新的定位请求。

修复方案

在getLastLocation返回null时,主动调用FusedLocationProviderClient.requestLocationUpdates()发起单次实时定位请求,获取最新位置后再执行业务逻辑,示例修改逻辑如下:

// 首先定义定位请求配置
private LocationRequest createLocationRequest() {
    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setInterval(10000);
    locationRequest.setFastestInterval(5000);
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    // 只拿一次定位结果就自动结束
    locationRequest.setNumUpdates(1);
    return locationRequest;
}

// 修改getLocation方法的逻辑
private void getLocation() {
    if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        fusedLocationClient.getLastLocation()
                .addOnSuccessListener(new OnSuccessListener<Location>() {
                    @RequiresApi(api = Build.VERSION_CODES.N)
                    @Override
                    public void onSuccess(Location location) {
                        if (location != null) {
                            // 原有非空逻辑不变
                            handleLocationResult(location);
                        } else {
                            // 缓存为空,主动发起新的定位请求
                            fusedLocationClient.requestLocationUpdates(createLocationRequest(), new LocationCallback() {
                                @Override
                                public void onLocationResult(@NonNull LocationResult locationResult) {
                                    super.onLocationResult(locationResult);
                                    Location newLocation = locationResult.getLastLocation();
                                    if (newLocation != null) {
                                        handleLocationResult(newLocation);
                                    } else {
                                        Toast.makeText(getContext(), "无法获取当前位置,请检查定位设置", Toast.LENGTH_LONG).show();
                                    }
                                }
                            }, Looper.getMainLooper());
                        }
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @RequiresApi(api = Build.VERSION_CODES.N)
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        if (searchRequest != null && searchRequest.getTerm() != null) {
                            doSearch();
                        }
                    }
                });
    } else {
        requestPermissionLauncher.launch(Manifest.permission.ACCESS_COARSE_LOCATION);
    }
}

// 把原来位置非空后的逻辑抽成公共方法
private void handleLocationResult(Location location) {
    searchRequest.setLatitude(String.valueOf(location.getLatitude()));
    searchRequest.setLongitude(String.valueOf(location.getLongitude()));
    userLocation = location;
    Log.d("lat", searchRequest.getLatitude());
    Log.d("long", searchRequest.getLongitude());
    doSearch();
}
额外优化建议
  • 如果你的应用对定位精度要求不高,可以保留ACCESS_COARSE_LOCATION权限,如果需要更高精度建议同时申请ACCESS_FINE_LOCATION权限
  • 可以增加定位超时逻辑,避免定位请求长时间无响应影响用户体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 03:06:04