如何连续跟踪Android手机的位置?

如何连续跟踪Android手机的位置?,第1张

概述我需要编写一个应用程序,每隔5分钟确定一次移动电话的当前位置(使用所有免费的可用位置提供商)并将其发送到服务器.如果某个位置提供程序在应用程序启动时不起作用,但稍后可用,则应用程序也应处理其位置数据.为了做到这一点,我实施了以下课程.在我的一个活动中,我创建了一个实例

我需要编写一个应用程序,每隔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<String> 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);}

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

@OverrIDeprotected 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)都没有解决问题.

解决方法:

您的代码可能是正确的,但是当您的手机正在睡眠时,位置提供商没有运行.您可能需要获取唤醒锁(如果您不关心电源抽取),或使用AlarmManager并安排您的应用程序定期唤醒并检查位置(您在等待更新时仍需要有活动的唤醒锁,或者由AlamManager或您自己获得.

总结

以上是内存溢出为你收集整理的如何连续跟踪Android手机的位置?全部内容,希望文章能够帮你解决如何连续跟踪Android手机的位置?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1102192.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存