Android:LocationManager动态调整minTime/minDistance阈值
这是我监听GPS位置更新的方式(使用Android:LocationManager动态调整minTime/minDistance阈值,android,android-location,Android,Android Location,这是我监听GPS位置更新的方式(使用LocationManager和LocationListener): 但是我想动态调整LocationManager\requestLocationUpdates使用的minTime和minDistance参数。我的目标是根据几项使用政策节约电池,即: 如果用户未移动,请增加minTime以获取位置更新 如果用户移动速度非常快,则增加思维距离 如果用户在室内(无GPS覆盖),请同时增加 如果电池电量过低,则同时增加两个电量 。。。(任何其他启发式) 我想知
LocationManager
和LocationListener
):
但是我想动态调整LocationManager\requestLocationUpdates
使用的minTime
和minDistance
参数。我的目标是根据几项使用政策节约电池,即:
- 如果用户未移动,请增加minTime以获取位置更新
- 如果用户移动速度非常快,则增加思维距离
- 如果用户在室内(无GPS覆盖),请同时增加
- 如果电池电量过低,则同时增加两个电量
- 。。。(任何其他启发式)
LocationManager#removeUpdates
和LocationManager#requestLocationUpdates
,如果有唯一的选择如果电池电量过低,请关闭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(extendsIntentService
)中触发常规位置侦听器,如下所示:
locMan=(LocationManager)getSystemService(LOCATION_SERVICE);
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, locationService);
让我做以下几点:
我唯一的问题是,如果位置没有变化,它就不起作用,因为警报的重置是在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);