使用.getLastLocation() FusedLocationProviderClient获取位置数据为空。

7

我在我的应用程序中通过点击按钮使用FusedLocationProviderClient获取坐标,并将其存储到数据库中。问题是,当我重新启动手机或模拟器时,.getLastLocation()为空,我必须再次点击按钮才能使其正常工作。如果.lastKnownPosition()的位置值为空,有没有一种方法来强制获取当前位置?

// 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 版本的实现:https://stackoverflow.com/a/67356008/6039240 - Amr
2个回答

16

当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


6

当手机重新启动时,缓存的上次位置会丢失,所以如果您没有打开使用GPS的应用程序(如谷歌地图或其他应用程序),那么就不会有上次位置。

永远不必返回位置给你,你应该总是假设它可能为空。

如果您想获取位置,只需像@tenprint在这个线程中所说的那样使用LocationCallback。

请参考以下链接

Android get location is null after phone reboot


该死,将固定位置设置为NULL实际上是在缓存中。 - Irodoku
只需要删除应用程序的缓存,我的问题就解决了,我简直不敢相信。 - Irodoku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接