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
相关产品推荐
相关产品推荐

