获取最后的位置,有很多方法

时间:2017-12-28 03:43:36

标签: android location locationmanager android-fusedlocation

当我查看Android教程和/或Android官方文档时,似乎有多种不同的方式来查询位置。我很困惑,因为我不确定哪种方式是正确的,或者文档是否过时。

例如,

1)GoogleApiClient:通过这种方式,它使用Google API客户端

 mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();

然后查询这样的位置

LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

2)位置管理器:这种方式使用位置管理器

LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);

3)FusedLocationApi(第二种风格):

mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
mFusedLocationClient.getLastLocation()
        .addOnSuccessListener(this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                // Got last known location. In some rare situations, this can be null.
                if (location != null) {
                    // Logic to handle location object
                }
            }
        });

我们应该使用哪种方式?

1 个答案:

答案 0 :(得分:3)

FusedLocationProvider是现在获取Android位置的最佳方式。 您已经提到了两种使用FusedLocationManager

的方法
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);

上述方法存在的问题是,它将为您提供最后一个可能为空的位置,因此您还需要检查空值。

 mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
 mFusedLocationClient.getLastLocation()
    .addOnSuccessListener(this, new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
            // Got last known location. In some rare situations this can be null.
            if (location != null) {
                // Logic to handle location object
            }
        }
    });

在上面的方法中,您正在注册一个fusionlocationListener,它将在成功注册时调用onSuccess方法并提供位置对象,这里也可能为null。通常在设备重启的情况下,最后一个已知位置为null。有还有一些其他案例。 我建议你使用第二种方法,因为它使用fuselocationprovider来获取最后的已知位置,因为它更有效。