【问题标题】:Issue in changing the location via latitude and longitude通过纬度和经度更改位置的问题
【发布时间】:2013-08-20 20:41:21
【问题描述】:

我在申请中遇到了关于纬度和经度的问题。 我的代码如下:-

LocationManager locationManager = (LocationManager) 
                    getSystemService(LOCATION_SERVICE);

            LocationListener locationListener = new LocationListener() {

                public void onLocationChanged(Location location) {


                Toast.makeText(
                        CheckInSOSMessageService.this,
                         "Location has been Changed now.....................", 0)
                        .show();

                isLocationChanged=true;

                    }

                public void onStatusChanged(String provider, int status,
                        Bundle extras) {
                }

                public void onProviderEnabled(String provider) {
                }

                public void onProviderDisabled(String provider) {

                }
            };

            locationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, 0, 0, locationListener);

在上面的代码中,一切正常。onLocationChanged 方法在位置发生变化时执行。但我的问题是,当我将设备从一个地方移动到另一个地方时,位置发生了变化,吐司通知出现在设备上,但 onLocationChanged 方法会执行多次又一次。这让我很恼火。我希望一旦位置更改,上述方法将只执行一次,再次移动设备后,它将执行。这是我的要求。请大家帮我解决这个问题。在此先感谢!

【问题讨论】:

  • 你用 isLocationChanged 做什么?您可以使用该变量,但更好的办法是取消注册侦听器以节省电量。
  • 我对 Android 的 Location API 不是很熟悉,但我可以想象的是,如果你移动你的设备,位置将会改变不止一次。愿你能保存 long 和 lat 的最后一个值,并将它们与新的值进行比较。如果差异足够大,请打印您的帖子。只是一个想法,不知道是不是真的

标签: android location


【解决方案1】:

即使您的手机一直在同一个位置,位置也会发生变化并触发 onLocationChanged。那是因为 GPS 信号不稳定,因为 f.e.信号在建筑物上的反射。您永远不会在适度的时间间隔内获得完全相同的位置。

为避免您暂时保存该位置并将其与新位置进行比较。如果它们之间的距离达到定义的边界,则使用新位置。

另一个建议是避免这样的请求

locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, 0, 0, locationListener);

因为这会产生大量垃圾邮件并且非常耗费资源。尝试一些适合您方法的不同 minTime 和 minDistance 值。那么onLocationChanged就不会每0ms触发一次。

编辑:

如果您希望每分钟更新一次位置,请使用这样的请求。

locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, 1000, 1000, locationListener);

您现在每分钟每公里都会收到更新。因为没有 minDistance 就无法请求更新,只需将其设置得足够高即可。

【讨论】:

  • 你好史蒂夫!实际上,我想在位置更改时将数据发送到服务器。如果在一分钟内没有发生更改,则数据将不会发送到服务器。同样,当位置再次更改时,数据将被发送到服务器。所以我只想知道位置是否发生变化??请帮我解决 thios 问题。我一定会接受你的回答。
  • 但是我如何测试应用程序?我是否需要超过 1 公里然后测试应用程序?
  • 如果超过 1 分钟或距离超过 1 公里,您将收到更新
  • 谢谢史蒂夫!!我想再问一个问题,我正在通过这行代码启动默认定位服务:- LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);现在我想在使用后停止定位服务,因为它会消耗大量电池。我该如何实现??
  • 请求是资源匮乏的部分。只需从管理器中删除侦听器即可。 LocationManager.removeUpdates(listener);
【解决方案2】:

您可以使用共享首选项来更新当前位置,并在运行逻辑后使用 location.distanceTo(loc) 从 sharedPrefs 中比较当前位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多