【问题标题】:LocationManager requestLocationUpdates minTime OR minDistanceLocationManager requestLocationUpdates minTime 或 minDistance
【发布时间】:2018-04-13 18:20:43
【问题描述】:

我正在使用 Android 的 LocationManager 及其方法 requestLocationUpdates,如下所示:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 10, this);

我发现位置更新必须同时满足 minTime 和 minDistance 的条件,但我需要每 3 秒或 10 米更新一次。

我尝试提出 2 个这样的请求:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, this);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 10, this);

但它不起作用,我只使用此代码每 10 米更新一次,而不是每 3 秒更新一次。

如果这很重要,我正在使用 API19。

【问题讨论】:

    标签: java android gps android-4.4-kitkat android-gps


    【解决方案1】:

    requestLocationUpdate() 上的文档说:

    requestLocationUpdates(字符串提供程序,长 minTime,浮点数 minDistance,LocationListener 监听器)

    使用指定的提供者和待定意图注册位置更新。

    所以你应该这样称呼它locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 10, this);

    但是如果你将 minTime 设置为 0,它会在它第一次收到位置更新时调用一次,然后直到你改变你的 minDistance 米的位置时才会调用它。

    Documentation Link for Reference

    编辑

    根据与@Matej 的讨论 我需要每 10 米更新一次,即使它发生在不到 3 秒内,也需要每 3 秒更新一次,即使位置变化不超过 10 米

    如果你想定期requestLocationUpdates,你应该使用TimerTimerTask,并让requestLocationUpdates每3秒运行一次

    schedule(TimerTask任务,长延时,长周期)

    安排指定任务重复固定延迟执行, 在指定的延迟之后开始。

    【讨论】:

    • 但是如何让它每 3 秒或 10 米调用一次呢?一定有办法
    • 但是只有当位置改变了 10 米并且已经过去了 3 秒时,这才会向我发送位置更新。我需要每 10 米更新一次,即使它发生在不到 3 秒内,也需要每 3 秒更新一次,即使位置变化不超过 10 米。
    • 将其设置为 3000 毫秒并不一定意味着您将每 3 秒获取一次位置。时间或多或少是最好的情况。无论如何,10 米的距离对于准确的数据或 Take TimerTask 并每三秒请求一次就绰绰有余了
    • 问题是这是任务的一部分,我们必须每 3 秒或 10 米记录一次位置。
    • 我一直在考虑这个问题,但我认为我可以通过 requestLocationUpdates 让它工作。谢谢
    【解决方案2】:

    我针对类似问题阅读了此讨论。 我必须每秒更新一次位置,但设置:

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
    

    我没有实现我的目标。 在官方文档中,我还读到,如果您确定更新的时间率,它可能不会像设置的那样严格。 (我再也找不到谈论的开发者页面了)。

    为了有一个固定的更新时间,我找到了这篇文章。

    我的问题是位置更新去更新(由观察者)活动,我在使用计时器时出错(如建议的那样)。 错误是:

    Only the original thread that created a view hierarchy can touch its views.
    

    对于任何有类似问题的人,我建议使用 Handler:

    Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                notifyLocationObservers();
            }
        }, 1000);
    

    【讨论】:

      猜你喜欢
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      相关资源
      最近更新 更多