代码之家  ›  专栏  ›  技术社区  ›  Guido

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

  •  8
  • Guido  · 技术社区  · 14 年前

    这是我监听GPS位置更新的方式(使用 LocationManager 和一个 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以获取位置更新
    • 如果用户移动得很快,增加距离
    • 如果用户在室内(无GPS覆盖),则增加两个
    • 如果电池电量过低,请同时增加两个
    • ... (任何其他启发式)

    我想知道:

    1. LocationManager#removeUpdates LocationManager#请求LocationUpdate 再说一次,如果有唯一的选择。

    编辑:应用程序是一个跟踪系统,可以知道人们在哪里,以便将任务分配给离给定地点最近的人。实际上电池很难维持8小时,所以我想增加电量。

    3 回复  |  直到 14 年前
        1
  •  4
  •   RAINA    5 年前

    好的,你需要打电话 removeUpdates requestLocationUpdates

    此外,你还可以通过其他方式来查看手机是否在移动,比如加速计。读一下 here see this other question's answers

    但是为了给你更多的想法,你需要提出问题本身。在没有问题之前,不要过早地尝试优化。如果你有你需要张贴的细节。

        2
  •  1
  •   CommonsWare    14 年前

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

    如果用户在室内(无GPS覆盖),则增加两个

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

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

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

        3
  •  1
  •   Chris Schiffhauer aleha_84    8 年前

    我做过这样的事:

    我有一个定位服务 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(扩展)中 IntentService )触发常规位置侦听器,如下所示:

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

    这让我做以下工作:

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

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