2013-06-03 3 views
38

Мое приложение предназначено для периодического отслеживания местоположения пользователя и отправки его на сервер. Недавно я изменил свой код с помощью API-интерфейсов API Google Play.Использование служб Google Play LocationClient в фоновом режиме

Я создал locationclient и подключен к услуге в onStartCommand

public int onStartCommand(Intent intent, int flags, int startId) { 
    setUpLocationClientIfNeeded(); 
    if(!mLocationClient.isConnected() || !mLocationClient.isConnecting()) 
    mLocationClient.connect(); 
    return START_STICKY; 

} 

и в методе onConnected, я посылаю запрос местоположения,

@Override 
public void onConnected(Bundle arg0) { 
    System.out.println("Connected ..."); 
    mLocationClient.requestLocationUpdates(REQUEST, this); 

} 

Объект запроса,

private static final LocationRequest REQUEST = LocationRequest.create() 
     .setInterval(5*60*1000)  // 5 minutes 
     .setFastestInterval(3*60*1000) // 3 minutes 
     .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

В настоящее время выпуск,

  1. метод onLocationChanged не получает вызов на данном интервале в течение 5 минут или самый быстрый интервал 3 минуты. Из журнала, который я видел, его вызов вызывали только дважды или трижды, после чего его вообще не вызывали (я проверил через 1 час).

В чем проблема с моим кодом выше ?. (Я также не видел никакого журнала для «отключенного»)

  1. Чтобы решить эту проблему, я попытался использовать диспетчер будильника для вызова задачи периодически. Теперь, как получить одно обновление местоположения через LocationClient из трансляционного вещателя. (Locationclient.getLastlocation() возвращает только последний сохраненный местоположение, но она не запрашивает новое местоположение)
+0

У меня очень похожая проблема. Я сделал быстрый и грязный сервис, который периодически запускается с AlarmManager, и каждый раз вызываю getLastLocation. Вызов, по-видимому, возвращает местоположение, но это местоположение никогда не обновляется. Я обнаружил, что открытие приложения Google Maps (возможно, работает с другими приложениями с поддержкой местоположения) неожиданно делает местоположения, полученные моим обновлением службы, нормально. Любая идея о том, что может произойти? –

+2

getlastlocation всегда использует пассивный провайдер вместо GPS или сетевого провайдера, что означает, что только когда какое-либо другое приложение (например, карты Google) получает последнее место. Наше приложение будет использовать тот же пассивно – ThiyagaB

+0

. Вы хотите отслеживать местоположение пользователя, когда приложение работает? или также когда он находится в фоновом режиме? – ddewaele

ответ

35

исходный код Full для фона услуга доступна здесь:

https://gist.github.com/blackcj/20efe2ac885c7297a676

Попробуйте добавить супер вызов к вашему onStartCommand.

/** 
* Keeps the service running even after the app is closed. 
* 
*/ 
public int onStartCommand (Intent intent, int flags, int startId) 
{ 
    super.onStartCommand(intent, flags, startId); 

    setUpLocationClientIfNeeded(); 
    if(!mLocationClient.isConnected() || !mLocationClient.isConnecting()) 
    { 
     mLocationClient.connect(); 
    } 

    return START_STICKY; 
} 
+0

красивый сниппет и обслуживание. Спасибо, что поделился. Быстрый вопрос: вы постоянно используете свой LocationClient? Если у вас были какие-либо проблемы или принудительные отключения? –

+2

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

+0

@blackcj посмотрел ваш код на github .. был сомнение. как я могу начать и остановить фоновое обслуживание от активности? что я пытаюсь сделать, это если перезагрузка активности, я бы хотел иметь ссылку на уже запущенную службу. Спасибо. – ggauravr

Смежные вопросы