【问题标题】:Android FusedLocationClient does not request new samplesAndroid FusedLocationClient 不请求新样本
【发布时间】:2018-09-04 14:28:53
【问题描述】:

如何强制 FusedLocationProviderClient 明确要求新位置?

几个月前,我升级了 FusedLocationProviderClient。从那以后,请求对新位置进行采样不会提供新位置。

// Request a single location. 
//   Note: FusedLocationProviderClient.lastLocation
//   is no better
val request = LocationRequest()
                .setNumUpdates(1)
                .setExpirationDuration(0)
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setMaxWaitTime(10*DateUtils.SECOND_IN_MILLIS)
                .setFastestInterval(0)
        fusedLocationClient?.requestLocationUpdates(request, object:LocationCallback() {
            override fun onLocationResult(result: LocationResult?) {
                super.onLocationResult(result)
                Log.v(LOG_TAG, "Single fused location request yields ${result?.lastLocation} ")
                callOnDone(result?.lastLocation)
            }
        }, Looper.getMainLooper())

当我获得请求位置时,即使相隔几秒钟,它也会获得具有相同时间戳的相同位置。

我使用带有 GPX 轨迹记录的模拟器,因此 GPS 读数始终可用。

但是,当我尝试向位置管理器请求位置时(并且对结果不做任何操作),它的效果要好得多。

(context?.getSystemService(Context.LOCATION_SERVICE) as? LocationManager)?
   .requestSingleUpdate(
       LocationManager.GPS_PROVIDER, 
       object :LocationListener{...dummy, just log the callback...},
       Looper.getMainLooper())

结论:即使在高优先级模式下,FusedLocationProviderClient 也不会从操作系统请求新位置。但是,如果可以从外部获得新位置,它确实接受新位置。

问题是:当我现在需要新位置时,如何强制 FusedLocationProviderClient 主动请求新位置?

【问题讨论】:

    标签: google-api location android-fusedlocation fusedlocationproviderclient


    【解决方案1】:

    这个问题已经很老了,但我带着一个类似的问题来到这里,我看到在过去的几个月里大约有 65 个其他问题。以下代码有效。它提供了一个位置 到 onLocationResult 回调,在 locationResult.getLastLocation():

       public void getNewLocation() {
      LocationRequest locationRequest = new LocationRequest()
            .setNumUpdates(1)
            .setFastestInterval(0)
            .setSmallestDisplacement(0)
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
      if (ActivityCompat.checkSelfPermission(context,
            Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(context,
            Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
         return;
      }
      fusedLocationProviderClient.requestLocationUpdates(locationRequest,
                  new com.google.android.gms.location.LocationCallback() {
                     @Override
                     public void onLocationResult(LocationResult locationResult) {
                        locationListener.onLocationChanged(locationResult.getLastLocation());
                     }
                  },
            Looper.getMainLooper());
    

    }

    这里的区别是我删除了setMaxWaitTimesetExpirationDuration。显然他们打破了电话。如果我解释 setExpirationDuration 正确,这意味着这个请求应该在 x 毫。将其设置为零意味着请求立即过期,因此当位置确实可用时,请求已经过期。 因此没有回调 onLocationChanged。

    我希望这对某人有所帮助。

    【讨论】:

    • 不。它没有。这是可以理解的:它是上述的一个子集,它只是谷歌文档中的一个 sn-p,它不起作用。
    • 哦,嗨;所以你还在看这个问题!它确实是原始代码的子集。似乎 setExpirationDuration 和/或 setMaxWaitTime 导致原始代码失败。没有它们,它就可以工作——对我来说。
    • 尝试了有无,因为我推测如果时间到了,它不会费心获取位置(尽管我仍然会得到一个并缓存它以备下次使用)。我并没有真正等待答案,我只是希望一些奇迹般的银弹答案偶然拯救了一天。实际上,我通过一些好的暴力部分缓解了它:从 Android API 请求位置。它在某些情况下有效。
    • 我只是在我的答案中添加了一些解释。另一个区别:我不使用模拟器;我在各种实际设备上进行了测试:一加、三星 S5、S9 等。
    • 酷。我用一些小米和低成本以及 S7 进行测试。还有一加
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2017-10-06
    • 1970-01-01
    • 2014-06-03
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多