Обновления местоположения GPS на Android с помощью AlarmManager внутри службы

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

Я пишу приложение для полевых сервисов для Android. В одной из Activities (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() его 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); 

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

Спасибо. 🙂

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

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

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

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

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

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

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