Android GPS日志记录时间不准确

时间:2016-05-29 01:29:50

标签: java android gps android-gps

在我的应用中,我正在尝试获取用户当前位置并进行记录。用户可以选择间隔。现在,日志记录不会持续发生。有时日志只会关闭几秒钟,有时它们会关闭几个小时。此外,如果它没有记录并且您关闭/打开GPS,那么它将再次开始工作。整个应用程序的基础是您只能在使用GPS时使用GPS获取您的位置。关于为什么会这样,我有一些理论。

我通过在广播接收器中使用AlarmManager setExact来获取日志。我知道这并不能保证完全准确,并且可能会在这里和那里占据几秒钟。

我也知道GPS可能需要一些时间才能获得。这个时间是否有正常范围。我可以看到这可能需要几分钟,但几个小时似乎很多。

我对loopers了解不多,而且我很难理解它们。我想知道requestSingleUpdate中的looper是否与它有任何关系

    locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, Looper.myLooper());

我知道loopers使用队列在后台处理任务,我不确定其他任务是否会卡在队列前面导致延迟。

我的最后一个理论是,它与搜索GPS信号时没有超时有关。如果我每隔10秒(最快允许)搜索一个信号,但手机无法找到信号,AlarmManager将再次发射,我将有两个服务试图获取信号。我真的不明白服务是如何工作的,所以我不知道这是否可能。

如果有人有任何想法/资源并且可以指出我正确的方向,我会非常感激。

这是代码。如果有帮助,我可以加入更多。

 @Override
public void onReceive(Context context, Intent intent) {

    SharedPreferences pref = context.getSharedPreferences(SettingsActivity.PREFERENCES, Context.MODE_PRIVATE);

    if(!pref.getBoolean(SettingsActivity.ARG_TRACK, true)){
        return;
    }

    alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    Intent alarmIntent = new Intent(context.getApplicationContext(), AlarmReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);

    long interval = pref.getLong(SettingsActivity.ARG_TRACKER_INTERVAL, 15000);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarmMgr.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+interval, pendingIntent);
    }else{
        alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
    }

    context.startService(new Intent(context.getApplicationContext(), AlarmService.class));
}

在我的服务中,我正在调用LocationManager requestSingleUpdate()

    locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, Looper.myLooper());

1 个答案:

答案 0 :(得分:0)

  

在我的应用中,我正在尝试获取用户当前位置并进行记录。用户可以选择间隔。现在,日志记录不会持续发生。有时日志只会关闭几秒钟,有时它们会关闭几个小时。此外,如果它没有记录并且您关闭/打开GPS,那么它将再次开始工作。整个应用程序的基础是您只能在使用GPS时使用GPS获取您的位置。关于为什么会这样,我有一些理论。

如果我没有在你的场景中,那么间隔不是位置提供者的周期。它是直接报警的时期。这样的故事

  • 用户选择间隔(句点),例如10分钟。
  • 10分钟(大约)后,设备唤醒并发出位置请求以接收单个位置。

在这种情况下,您将面临gps提供商的滞后。所以,每次醒来时,你都在等待gps提供者保持温暖。这就是原木不一致的原因。

  

我通过在广播接收器中使用AlarmManager setExact来获取日志。我知道这并不能保证完全准确,并且可能会在这里和那里占据几秒钟。

您正在使用确切的设置进行唤醒。这不是长滞后的实际原因。

  

我也知道GPS可能需要一些时间才能获得。这个时间是否有正常范围。我可以看到这可能需要几分钟,但几个小时似乎很多。

你必须等到GPS提供商变暖。这个变暖的时间可能会因你现在所处的位置而改变。如果你在建筑物内,需要很长时间

  

我不太了解loopers并且很难理解它们。我想知道requestSingleUpdate中的looper是否与它有任何关系

简单地说,当你在这里传递一个线程的looper时,onLocationChanged()方法将被用于looper。但是你已经提出了单一请求。不会再触发更新。 (在您的方案中,每次唤醒都是一次单一位置请求)

  

我的最后一个理论是,它与搜索GPS信号时没有超时有关。如果我每隔10秒(最快允许)搜索一个信号,但手机无法找到信号,AlarmManager将再次发射,我将有两个服务试图获取信号。我真的不明白服务是如何运作的,所以我不知道这是否可能。

这是您的方案的问题。如果您在短时间内设置闹钟,则可能会发生下一次唤醒。你可以按照以下方式进行操作

  • 由于等待gps温暖,请至少进行5分钟的长时间报警
  • 制作超时方案,例如等待1分钟或更长时间,直到收到位置。
  • 如果无法及时收到位置,请关闭所有内容并等待下一次唤醒。