【问题标题】:FusedLocationClient vs LocationManager in Initial Location初始位置中的 FusedLocationClient 与 LocationManager
【发布时间】:2018-09-13 22:08:31
【问题描述】:

在 Android 中选择 LocationManagerFusedLocationClient 非常简单,只需使用 FusedLocationClient,因为它会节省电量,建议将其作为最佳做法。

但是,我必须获取设备的“初始位置”,或者只是获取当前/最后一个已知位置。 FusedLocationClient 在 3 种不同情况下可能会认为是 null 的东西。 (see here)。

在设备的实际位置发生变化之前,这不会改变,当然,在请求位置更新时。 (here)

在android框架提供的LocationManager中,只需调用mLocationManager.getLastKnownLocation(provider);就可以轻松获取最近的已知位置,但用它来监听更新会消耗大量电量。

这里最好的解决方案是什么?两者结合合理吗?如果是,如何使用 LocationManager 只获取当前位置,然后禁用它以节省电量?

【问题讨论】:

  • 我将两者结合起来。我使用 getLastKnownLocation 作为第一步,但使用 FusedLocation API 观察到位置更新
  • 这是一个已知问题:issuetracker.google.com/issues/36975498#comment125您找到解决方法了吗?
  • @Tiago 我首先检查了 FusedLocation,如果它为空,我使用旧的 LocationManager 来获取当前位置,然后将其与所有可用的提供者进行比较以获得它们中的最佳位置

标签: android google-play-services android-location android-fusedlocation


【解决方案1】:

您可以通过this document:

private FusedLocationProviderClient mFusedLocationClient;
private LocationRequest mLocationRequest;
mLocationRequest = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
            .setInterval(60000) ;     // 10 seconds, in milliseconds
          .setFastestInterval(10000); // 1 second, in milliseconds
if(mFusedLocationClient == null) {
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(mContext);
        mFusedLocationClient.requestLocationUpdates(mLocationRequest,
                locationCallback,
                null /* Looper */);
    }
 private LocationCallback locationCallback = new LocationCallback(){
    @Override
    public void onLocationResult(LocationResult locationResult) {
        super.onLocationResult(locationResult);
        Location location = locationResult.getLastLocation();
        if(location != null) {...you can get updated location
}}
//REMOVE LOCATION UPDATES
mFusedLocationClient.removeLocationUpdates(locationCallback);

【讨论】:

  • 这不是我的意思。我知道我可以请求位置更新,但在设备的位置实际发生变化之前不会发送它们。同时,如果位置从未改变,您将“有时”在尝试获取最后一个位置时获得 null
  • 好吧..我明白了。如果您禁用位置服务,那么您将获得空位置,因为它会清除缓存。因此,您必须自己创建一个新客户端并请求位置更新。请再次参考this document中的最后一点,获取位置后您可以将其删除。
  • 它会一直返回null,位置不会更新,直到位置改变并调用监听器
  • 在谷歌地图或其他应用程序请求位置更新后,不会更新任何位置
  • getLastKnownLocation 基于请求位置更新的另一个应用程序在设备中存储的位置。因此 LocationManager 和 FusedLocationAPI 都会为您提供由另一个应用程序存储在设备中的最后一个已知位置,否则位置将为空
猜你喜欢
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多