Android:LocationManager动态调整minTime / minDistance阈值

时间:2010-08-22 11:57:02

标签: android android-location

这是我收听GPS位置更新的方式(使用LocationManagerLocationListener):

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

但我想动态调整minTime使用的minDistanceLocationManager#requestLocationUpdates参数。我的目标是根据几个使用政策节省电池,即:

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

我想知道:

  1. 节省电池寿命真的是个好主意吗?
  2. 我怎么能做那种调整?如果有唯一的选择,我可以再次拨打LocationManager#removeUpdatesLocationManager#requestLocationUpdates
  3. 您知道实现这种自适应算法的任何想法或示例代码吗?
  4. 编辑:应用程序是一个跟踪系统,用于了解人员的位置,以便将任务分配给最接近给定人员的人员。实际上电池几乎不会持续8个小时,所以我想增加它。

3 个答案:

答案 0 :(得分:4)

AFAIK您需要再次致电removeUpdatesrequestLocationUpdates

此外,您还可以通过其他方式查看手机是否正在移动,例如加速度计。阅读heresee this other question's answers

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

答案 1 :(得分:1)

  

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

可能不是。 AFAIK,GPS收音机将是整个时间,这是你所描述的最大的电池消耗。节省电池的方法是删除更新,以便GPS无线电关闭。但是,下次请求位置更新时,GPS需要一些时间来获取其初始修复。

  

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

如果您无法获得GPS定位,请关闭无线电,稍后再尝试几分钟(或根据UI事件或其他事项)。没有任何意义,如果没有对你做任何好事,请打开GPS。

  

如果电池电量过低,请同时增加电池

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

答案 2 :(得分: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. 如果在警报触发之前没有获得更新,则会强制触发警报,从而确保我们在需要时获得更新。

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