【问题标题】:Getting last location, so many ways获取最后一个位置,有很多方法
【发布时间】:2018-06-08 15:20:32
【问题描述】:

当我查看 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(第 2 种样式):

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
                }
            }
        });

我们应该使用哪种方式?

【问题讨论】:

    标签: android location locationmanager android-fusedlocation


    【解决方案1】:

    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
                }
            }
        });
    

    在上面的这种方法中,您正在注册一个 fusedlocationListener 成功注册后将调用 onSuccess 方法并提供位置对象,该对象在此处再次可能为空。通常在设备重启情况下,最后一个已知位置为空。有还有一些其他情况。 我建议您使用第二种方法,因为它使用 fusedlocationprovider 来获取最后一个已知位置,因为它更有效。

    【讨论】:

    • 所以你说的是 LocationManager apporach 是旧的方式,只是因为 fusedLocation 更新而不再推荐。正确的?另外,您为什么要使用 mFusedLocationClient 而不是 GoogleApiClient,因为两者都是 fusedLocation?
    • 顺便说一句,获得 Null 的情况并不罕见。在大多数情况下,只需从设置中关闭定位服务也会产生 null
    • mfusedlocationclient 是一种抽象方式,它为您提供了 fusedlocationprovider,您可以在使用 googleapiclient 时直接使用它,您必须管理连接,然后在您进行的活动或片段破坏时禁用连接连接
    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2016-03-18
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多