Периодическое обновление местоположения GPS с помощью AlarmManager внутри Сервиса - PullRequest
4 голосов
/ 26 марта 2012

Здесь я прочитал много вопросов, но не смог понять, в чем проблема.

Я пишу приложение для полевого сервиса для Android.В одном из занятий (MyActivity.java) у меня есть две кнопки: Пуск и Стоп.

Когда полевой рабочий нажимает на старт, мне нужно получить его текущее местоположение с помощью GPS и отправить его на сервер через определенные промежутки времени (скажем, по умолчанию это 5 минут, здесь я установил его на 20 секунд для тестирования).Заказчик хочет, чтобы он видел, как долго рабочие проводят время в пробках, в моем городе (Стамбул) трафик беспорядок.

У меня в работе 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);

Там написано, что ЛУЧШИЙ ПОСТАВЩИК: 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);

Прежде всего, это хороший подход для этого?Если это так, пожалуйста, проверьте, что мне не хватает.Если это не так, скажите, пожалуйста, как я могу реализовать это лучше?

Спасибо.:)

Ответы [ 2 ]

8 голосов
/ 26 марта 2012

Во-первых, вы не можете зарегистрироваться для получения обновлений местоположения, затем отключите службу.В лучшем случае вы будете пропускать потоки.В худшем случае Android остановит ваш процесс (думая, что в нем ничего не работает), и вы не получите обновление.Кроме того, для прогрева GPS требуется некоторое время, поэтому вы не сможете получить исправления в течение 20 секунд, особенно в городских условиях.Кроме того, вы должны убедиться, что устройство не спит, когда вы пытаетесь собрать исправление.

В результате, получение периодических исправлений местоположения в фоновом режиме является довольно сложной проблемой.

Iнаписал уже снятый с производства LocationPoller, чтобы попытаться решить эту проблему, и другой разработчик разветвил и расширил его .Вы можете попробовать вилку или просто использовать ее как источник идей.

1 голос
/ 29 марта 2013

попробуйте это:

AlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,,,);

Я пытаюсь получить текущее местоположение с помощью GPS, но мой проект работает каждые 10 секунд. Я понятия не имею, сейчас. И мой код:

AlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),6000000,pi);
...