【问题标题】:Android when exactly is onLocationChanged calledAndroid 何时调用 onLocationChanged
【发布时间】:2017-09-13 02:54:35
【问题描述】:

在我看来,它在活动第一次开始时被调用,就在 onCreate 之后,然后似乎以随机间隔被调用,无论我是否移动???

不管怎样,如果我在 onCreate 方法中有这样的代码,它会自动调用吗?

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();

是吗???

干杯, 迈克。

【问题讨论】:

    标签: android


    【解决方案1】:

    您的问题最初并不清楚。您的代码和标题不匹配。我只回答你的标题。

    您必须为您的位置管理器注册位置侦听器,然后根据您在注册位置侦听器时提供的设置仅调用 onLocationChanged()。

    请参阅下面的代码如何做到这一点。我使用了 GPS Provider,您也可以根据标准使用任何提供商。

    LocationManger lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    // TODO Auto-generated method stub
                }
                @Override
                public void onProviderDisabled(String provider) {
                    // TODO Auto-generated method stub
                }
                @Override
                public void onProviderEnabled(String provider) {
                    // TODO Auto-generated method stub
                }
                @Override
                public void onStatusChanged(String provider, int status,
                        Bundle extras) {
                    // TODO Auto-generated method stub
                }           
            });
    

    关于您的问题,如果当前位置更新与最后一个已知位置不匹配,将调用 onLocationChanged()。

    更新的位置将在每 minTime(在我的情况下为 1000 毫秒)以及设备移动 minDistance(在我的情况下为 0 米)距离时更改。

    希望你能理解这一点。

    【讨论】:

    • 对不起,Yugandhar,我确实有太多问题,我不得不停止这样做,所以很混乱。
    • 我在另一个活动中拥有与您完全相同的代码,这是我想使用的代码,但无论我如何尝试,一旦开始,我都无法终止该活动。我将不得不把它放在另一个帖子中。感谢您的帮助!
    • 但是您如何区分由于您的位置未更改而未调用 onlocationchanged 的​​情况,以及由于 gps 信号较弱且无法获得位置修复而未调用 onlocationchanged 的​​情况?
    • 即使您将minTime 设置为100ms,onLocationChanged() 方法也会在一秒钟后被调用,我认为默认情况下,1000ms 是您可以设置的最小时间,或者如果您设置的时间低于此值, 1000ms 将在幕后使用。
    【解决方案2】:

    如果你想捕捉新的位置,你必须像这样注册一个 LocationListener:

    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    LocationListener listener = new LocationListener() {
       ...
    }
    locationManager.requestLocationUpdates(GPS_PROVIDER, intervall, distance, listener);
    

    使用 intervalldistance 您可以配置:

    1. 如果 intervall 大于 0,LocationManager 可能会在位置更新之间休息 intervall 毫秒
    2. 如果 distance 大于 0,则仅当设备移动 distance 米时才会广播位置。

    LocationListener 注册后,LocationManager 开始获取您的地理位置并调用 onLocationChanged()。如果 距离 非常低,则可能会在短时间内频繁调用该方法。根据intervall,LocationManager 将在之后休息。

    我认为,LocationManager 只有在注册 LocationListener 时才会开始工作。

    希望对您有所帮助...

    干杯, 托比

    【讨论】:

      【解决方案3】:
      public void onLocationChanged(Location location)
      

      一旦你的位置改变了,上面的方法就会被自动调用..

      【讨论】:

      • "如果您遇到问题,那么您可能做错了什么。" - 杰出的! :)
      猜你喜欢
      • 2017-08-07
      • 2023-03-13
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多