android 跟踪方法调用,如何连续跟踪Android手机的位置?

博客作者在开发一个应用程序,旨在每5分钟获取手机的当前位置并将其发送到服务器。他们遇到的问题是,即使在多次移动后,位置更新也只有一次记录。在尝试使用AlarmManager进行定时位置更新时,发现在设备休眠期间,onActivityResult方法没有被调用。作者已经尝试了不同的AlarmManager设置,但问题仍未解决。
摘要由CSDN通过智能技术生成

我需要编写一个应用程序,每隔5分钟确定一次移动电话的当前位置(使用所有免费的可用位置提供商)并将其发送到服务器.

如果某个位置提供程序在应用程序启动时不起作用,但稍后可用,则应用程序也应处理其位置数据.

为了做到这一点,我实施了以下课程.在我的一个活动中,我创建了一个实例并调用其startTrackingUpdates方法. locationChangeHandler处理位置数据.

public class LocationTracker implements ILocationTracker, LocationListener {

public static final long MIN_TIME_BETWEEN_UPDATES = 1000 * 60 * 5; // 5 minutes

public static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

private ILocationManager locationManager;

private ILocationChangeHandler locationChangeHandler;

public LocationTracker(final ILocationManager aLocationManager,

final ILocationChangeHandler aLocationChangeHandler) {

this.locationManager = aLocationManager;

this.locationChangeHandler = aLocationChangeHandler;

}

public void startTrackingUpdates() {

final List providers = locationManager.getAllProviders();

for (final String curProviderName : providers)

{

final ILocationProvider provider = locationManager.getLocationProvider(curProviderName);

if (!provider.hasMonetaryCost())

{

subscribeToLocationChanges(provider);

}

}

}

private void subscribeToLocationChanges(final ILocationProvider aProvider) {

locationManager.requestLocationUpdates(aProvider.getName(), MIN_TIME_BETWEEN_UPDATES,

(float)MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

}

public void onLocationChanged(final Location aLocation) {

locationChangeHandler.processLocationChange(new LocationWrapper(aLocation));

}

public void onProviderDisabled(final String aProvider) {

}

public void onProviderEnabled(final String aProvider) {

}

public void onStatusChanged(final String aProvider, final int aStatus,

final Bundle aExtras) {

}

}

我构建了应用程序并将其安装在我的手机上.然后,早上我拿起手机,上班,然后回家.在家里,我检查了应用程序一天工作的结果,发现数据库中只有一条记录.

如果系统的其余部分(将位置数据传输到服务器,保存在数据库中)正常工作,我必须在位置跟踪代码中遇到一些问题(即使我多次更改了我的位置,也没有调用onLocationChanged).

我的代码有什么问题(我应该如何更改它,以便每当手机的位置根据其中一个locatin提供商的位置变化超过MIN_DISTANCE_CHANGE_FOR_UPDATES时,就会调用onLocationChanged)?

更新1(18.08.2013 13:59 MSK):

我根据msh建议改变了我的代码.我使用以下代码启动计时器:

public void startSavingGeoData() {

final IAlarmManager alarmManager = activity.getAlarmManager();

final IPendingIntent pendingIntent = activity.createPendingResult(

ALARM_ID, intentFactory.createEmptyIntent(), 0);

alarmManager.setRepeating(INTERVAL, pendingIntent);

}

在我放置以下计时器事件处理程序的活动中:

@Override

protected void onActivityResult(final int aRequestCode, final int aResultCode,

final Intent aData) {

geoDataSender.processOnActivityResult(aRequestCode, aResultCode,

new IntentWrapper(aData));

}

当手机开启时,一切都按预期工作 – onActivityResult在INTERVAL毫秒内执行一次.

但是当我按下电源按钮(屏幕变为禁用)时,根本不会调用onActivityResult.当我再次按下电源按钮时,onActivityResult会执行多次,因为自我关闭手机以来已经过了INTERVAL.如果我将手机关闭1 * INTERVAL毫秒,它将触发一次.如果我将手机关闭2 * INTERVAL毫秒,它将触发两次等.

注意:通过“关闭”,我的意思是短按电源按钮(例如,手机仍然“活着”并对传入的短信作出反应).

我应该如何修改startSavingGeoData的代码,以便在每个INTERVAL毫秒内执行onActivityResult方法,即使手机处于休眠状态?

更新2(18.08.2013 19:29 MSK):alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,0,INTERVAL,pendingIntent)和alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,INTERVAL,INTERVAL,pendingIntent)都没有解决问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值