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

Android:LocationManager动态调整minTime/minDistance阈值,android,android-location,Android,Android Location,这是我监听GPS位置更新的方式(使用LocationManager和LocationListener): 但是我想动态调整LocationManager\requestLocationUpdates使用的minTime和minDistance参数。我的目标是根据几项使用政策节约电池,即: 如果用户未移动,请增加minTime以获取位置更新 如果用户移动速度非常快,则增加思维距离 如果用户在室内(无GPS覆盖),请同时增加 如果电池电量过低,则同时增加两个电量 。。。(任何其他启发式) 我想知

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

但是我想动态调整
LocationManager\requestLocationUpdates
使用的
minTime
minDistance
参数。我的目标是根据几项使用政策节约电池,即:

  • 如果用户未移动,请增加minTime以获取位置更新
  • 如果用户移动速度非常快,则增加思维距离
  • 如果用户在室内(无GPS覆盖),请同时增加
  • 如果电池电量过低,则同时增加两个电量
  • 。。。(任何其他启发式)
我想知道:

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

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

    可能不会。好吧,GPS收音机会一直开着,这是你所描述的最大的电池消耗。节省电池的方法是删除更新,这样GPS收音机就会关闭。但是,下次您请求位置更新时,GPS需要一些时间才能获得其初始定位

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

    如果无法获得GPS定位,请关闭收音机,并在几分钟后重试(或基于UI事件或其他原因)。如果GPS对你没有任何好处,那么让它开着是没有意义的

    如果电池电量过低,则同时增加两个电量


    如果电池电量过低,请关闭GPS。要么切换到低功耗提供商(使用
    标准
    查找),要么不使用位置数据。让用户通过首选项来决定什么是“过低”。

    好的,您需要再次调用
    removeUpdates
    requestLocationUpdates

    此外,您还可以通过其他方式查看手机是否在移动,比如加速计。读一读,然后


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

    我做过类似的事情:

    我有一个LocationService(扩展
    服务
    并实现
    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);
    
    让我做以下几点:

  • 如果系统在alarmManager触发ForceLocationService之前获得任何位置更新,它将自动获得更新并重置报警

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


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

    有趣的问题,尽管我帮不了多少忙。我认为节约电池是个好主意。我倾向于说你建议的解决方案是唯一的,但我不是位置API方面的专家,所以我会让其他人说。[我在我的应用程序中使用了相同的代码,但它不返回任何值,我想知道你们中是否有人可以帮我…][1][1]:删除和添加,就像这样:谢谢。您认为什么时候最好保持GPS收音机处于打开状态(比关闭再打开要好)。几秒钟,几分钟?我的意思是,如果我每30秒需要一个补丁,最好保持它,但如果你每5分钟需要一个补丁,那就不是真的了。你不能按程序打开GPS,你的用户需要为你打开它。您可以向他们显示设置屏幕。为了回答您需要轮询数据的频率,请提供更多详细信息。例如,您使用位置数据的目的是什么?@Pentium10:为了减少混淆,并与Android文档相匹配,我使用“启用”和“禁用”作为用户通过设置控制的内容,使用“开”和“关”表示GPS无线电是否正在耗电并获得修复。@Guido:如Pentium10所示,很难抽象地回答你。请记住,刚打开GPS后需要一段时间才能获得修复。所以,如果你每5分钟需要修复一次,但你必须马上修复,你可能无法关闭GPS。就我个人而言,我会让用户通过偏好在这里做出尽可能多的决定。谢谢。这是一个内部应用程序,用户没有多少技术技能,因此他们不知道什么是GPS,强迫他们更改设置或打开和关闭GPA收音机存在可用性问题。现在电池的续航时间为8-10小时,我们需要将其延长至至少12小时。
    locMan=(LocationManager)getSystemService(LOCATION_SERVICE);
    locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, locationService);