gpt4 book ai didi

Android 定期 GPS 位置更新与服务内的 AlarmManager

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:06 28 4
gpt4 key购买 nike

我在这里阅读了很多问题,但无法弄清楚问题是什么。

我正在为 Android 编写现场服务应用程序。在其中一个 Activity (MyActivity.java) 中,我有两个按钮:开始和停止。

当现场工作人员按下开始时,我需要通过 GPS 获取他的当前位置并及时将其发送到服务器(假设默认为 5 分钟,这里我将其设置为 20 秒以进行测试)。客户希望通过此查看 worker 在交通中花费了多长时间,我所在的城市( Istanbul 尔)的交通一团糟。

我的 Activity 中有一个 AlarmManager,当按下开始按钮时,AlarmManager.setRepeating() 设置警报以启动服务 (ServiceClass.java)。

Intent intent = new Intent (MyActivity.this, ServiceClass.class);
mPendingIntent = PendingIntent.getService(MyActivity.this, 0, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
mAlarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 20*1000,
mPendingIntent);

我使用“停止”按钮取消了警报。

直到这里,服务才开始正常工作。它的onCreate()onStart()onDestroy() 方法被执行。但是我无法获取位置。我没有在真实设备上工作,所以我使用 DDMS 发送位置。但应用程序会跳过该步骤并将我所在位置的经度和纬度打印为 Lon:0 Lat:0。

这是服务中的代码:

public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d("Testing", "Service got started, calling location updates:");
mLocationManager.requestSingleUpdate(mCriteria, mLocationListener,
getMainLooper());
Log.i("TESTING LOCATION UPDATE: LOCATION:", "\nLat:" + mLatitude +
" Lon:" + mLongitude);
stopSelf(startId);
Log.d("Testing", "Service Stopped!");

最后,这是我的 LocationListener:

 mLocationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {

if(location != null){
mLatitude = location.getLatitude();
mLongitude = location.getLongitude();
Log.i("onLocationChanged(Location location)", "Lat:"+mLatitude + "
Lon:" + mLongitude);
}

当我运行代码时,还有一些东西引起了我的注意:

mLocationProvider = mLocationManager.getBestProvider(mCriteria, true);
Log.i("BEST PROVIDER IS:", mLocationProvider);

上面写着 BEST PROVIDER IS: gps。但是 onProviderEnabled() 中的这个日志永远不会显示在 logcat 中。

@Override
public void onProviderEnabled(String s) {
Log.v("onProviderEnabled", "ENABLED");
}

如果我使用,要添加两件事:

mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
mLocationListener);

它也不起作用。

然而,这有效,我可以获得 LastKnownLocation:

Location lastKnown = mLocationManager.getLastKnownLocation(
LocationManager.GPS_PROVIDER);

首先,这是执行此操作的好方法吗?如果是,请检查我遗漏了什么。如果不是,您能告诉我如何更好地实现吗?

谢谢。 :)

最佳答案

首先,您不能注册位置更新,然后关闭该服务。充其量,您将泄漏线程。在最坏的情况下,Android 将终止您的进程(认为其中没有任何运行)并且您将不会获得更新。此外,GPS 需要一段时间预热,因此您可能无法在 20 秒内获得定位,尤其是在城市环境中。此外,您必须确保设备在尝试收集修复时保持唤醒状态。

因此,在后台获取定期位置修复是一个相当复杂的问题。

我写了一个现已停产的 LocationPoller 来尝试解决这个问题,并且 another developer has forked and extended it .您可以尝试 fork 或只是将其用作想法的来源。

关于Android 定期 GPS 位置更新与服务内的 AlarmManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9869153/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com