带有 .getLastLocation() FusedLocationProviderClient 的位置数据为空
Posted
技术标签:
【中文标题】带有 .getLastLocation() FusedLocationProviderClient 的位置数据为空【英文标题】:location data null with .getLastLocation() FusedLocationProviderClient 【发布时间】:2019-05-22 15:29:15 【问题描述】:我在我的应用程序中通过单击按钮获取与 FusedLocationProviderClient 的坐标以存储到数据库中。问题是,当我重新启动手机或模拟器时,.getLastLocation()
为空,我必须再次单击我订购的按钮才能使其正常工作。如果location from .lastKnownPosition()
的值为null,有没有办法强制获取当前位置?
// Google fused location client for GPS position
private FusedLocationProviderClient flpc;
// Vars to store GPS info
public Double latitude, longitude;
public Float accuracy;
// Google Fused Client for location
public void getLocation()
// FusedLocationProviderClient
flpc = LocationServices.getFusedLocationProviderClient(context);
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
......
return;
// Get the latest position from device
Task<Location> task = flpc.getLastLocation();
task.addOnSuccessListener(new OnSuccessListener<Location>()
@Override
public void onSuccess(Location location)
if(location!=null)
latitude = location.getLatitude();
longitude = location.getLongitude();
accuracy = location.getAccuracy();
);
在我的按钮处理程序中,我调用 getLocation()
并使用纬度、经度和准确度来存储到数据库中。
任何帮助表示赞赏!
【问题讨论】:
在此处查看我接受的答案的 kotlin 版本 ***.com/a/67356008/6039240 【参考方案1】:当getLastLocation()为null时,需要发出LocationRequest
private LocationRequest locationRequest;
private LocationCallback locationCallback;
...
locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(20 * 1000);
locationCallback = new LocationCallback()
@Override
public void onLocationResult(LocationResult locationResult)
if (locationResult == null)
return;
for (Location location : locationResult.getLocations())
if (location != null)
wayLatitude = location.getLatitude();
wayLongitude = location.getLongitude();
txtLocation.setText(String.format(Locale.US, "%s -- %s", wayLatitude, wayLongitude));
;
mFusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
如果您不需要持续更新,您可以在收到请求后将其删除。
mFusedLocationClient.removeLocationUpdates(locationCallback);
更多信息在这里:https://medium.com/@droidbyme/get-current-location-using-fusedlocationproviderclient-in-android-cb7ebf5ab88e
【讨论】:
【参考方案2】:当手机重新启动时,缓存的最后一个位置会丢失,所以如果你没有打开一个使用 GPS 的应用程序,如谷歌地图或其他东西,那么将没有最后一个位置。
不必将位置返回给您,您应该始终假设它可能为空。
如果你想获取位置,你只需要使用 LocationCallback 正如@tenprint 在这个线程中所说的。
参考这个链接
Android get location is null after phone reboot
【讨论】:
该死的 NULL 的固定位置实际上是在缓存上。 删除应用缓存后我的问题就解决了,我不敢相信以上是关于带有 .getLastLocation() FusedLocationProviderClient 的位置数据为空的主要内容,如果未能解决你的问题,请参考以下文章
为啥 FusedLocationApi.getLastLocation 为空
为啥 fusedLocationProviderClient.getLastLocation 从不调用 OnSuccessListener?