android - 获取最后一个位置,有很多方法

标签 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) Location Manager: 这种方式使用location Manager

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

我们应该使用哪种方式?

最佳答案

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 来获取最后已知的位置,因为它更有效。

关于android - 获取最后一个位置,有很多方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48001338/

相关文章:

Android M Google api 客户端位置速度始终为 0 和 location.hasSpeed false

安卓:释放GPS

android - 升级到 Lollipop 后无法测试应用程序

php - 我什么时候应该在没有 die() 的情况下调用 header ('Location' )?

ios - 在任何时候在iOS 7或更高版本中在后台启动定位服务

android - java.lang.IllegalArgumentException : provider==null 异常

android - LocationManager requestLocationUpdates 不起作用

android - "eglConfig not initialized"错误,但我没有使用 openGl

android - 如何将 sqlite3 关键字 DISTINCT 注入(inject)到 Android ContentProvider 的查询中?

android - 键盘弹出窗口阻止了 delphi xe5 Firemonkey 中应用程序的 View