8

这是我收听 GPS 位置更新的方式(使用LocationManager和 a LocationListener):

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
listener = new MyLocationistener(); // LocationListener
locationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, 
        30000, // milliseconds (minTime)
        20, // meters (minDistance)
        listener );

minTime但我想动态minDistance调整LocationManager#requestLocationUpdates. 我的目标是根据几个使用政策来节省电池,即:

  • 如果用户没有移动,则增加 minTime 以获取位置更新
  • 如果用户移动非常快,增加 minDistance
  • 如果用户在室内(没有 GPS 覆盖),则同时增加
  • 如果电池太低,请同时增加
  • ...(任何其他启发式)

我想知道:

  1. 这真的是节省电池寿命的好主意吗?
  2. 我怎么能做这样的调整?如果有唯一的选择,我可以一次又一次地打电话LocationManager#removeUpdatesLocationManager#requestLocationUpdates
  3. 您知道实现这种自适应算法的任何想法或示例代码吗?

编辑:该应用程序是一个跟踪系统,用于了解人们的位置,以便将任务分配给离给定位置最近的人。实际上电池几乎不能持续8小时,所以我想增加它。

4

3 回答 3

4

AFAIK,您需要一次又一次地removeUpdates打电话requestLocationUpdates

此外,您可以研究其他方法来查看手机是否在移动,例如加速度计。在此处阅读并查看其他问题的答案

但是为了给你更多的想法,你需要提出问题本身。不要尝试过早优化,直到没有问题为止。如果您有,您需要发布有关它的详细信息。

于 2010-08-22T12:27:56.627 回答
1

这真的是节省电池寿命的好主意吗?

可能不是。AFAIK,GPS 收音机将一直打开,这是您所描述的最大的电池消耗。节省电池的方法是删除更新,因此 GPS 无线电会关闭。但是,下次您请求位置更新时,GPS 将需要一些时间来获取其初始定位。

如果用户在室内(没有 GPS 覆盖),则同时增加

如果您无法获得 GPS 定位,请关闭无线电,并在几分钟后重试(或基于 UI 事件或其他内容)。如果它对你没有任何好处,那么让 GPS 处于开启状态是没有意义的。

如果电池太低,请同时增加

如果电池电量太低,请关闭 GPS。要么切换到低功耗供应商(用于Criteria查找),要么不使用位置数据。让用户通过偏好来决定什么是“太低”。

于 2010-08-22T12:24:49.503 回答
1

我做了这样的事情:

我有一个 LocationService (扩展Service和实现LocationListener)。我加了

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 1, 1, this);

在 onLocationChangedListener 中:

    public void onLocationChanged(Location location) {
        AlarmManager aleManager = (AlarmManager) LocationService.context.getSystemService(ALARM_SERVICE);
//Change the values of MINIMIUM_TRIGGER_TIME and INTERVAL_TIME
        Intent forceLoc = new Intent(LocationService.context,
                ForceLocationService.class);
        PendingIntent pendingForceLoc = PendingIntent.getService(
                LocationService.context, 0, forceLoc,
                PendingIntent.FLAG_ONE_SHOT);
        // CANCEL PREVIOUS alarm and set new one
        aleManager.cancel(pendingForceLoc);
        aleManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                MINIMIUM_TRIGGER_TIME, INTERVAL_TIME, pendingForceLoc);
    }

并在 ForceLocationService (extends IntentService) 中触发常规位置侦听器,如下所示:

locMan=(LocationManager)getSystemService(LOCATION_SERVICE);
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, locationService);

这让我可以做到以下几点:

  1. 如果系统在alarmManager 触发ForceLocationService 之前获得任何位置更新,它会自动获取更新并重置警报。

  2. 如果在警报触发之前它没有获得更新,那么它会强制触发警报,从而确保我们在需要时获得更新。

我唯一的问题是,如果位置没有变化导致警报的重置是在 onLocationChanged() 中完成的,它就不起作用。

于 2012-12-10T15:19:47.370 回答