2013-06-03 19 views
38

La mia app è progettata per tracciare periodicamente la posizione dell'utente e inviarla al server. Recentemente ho cambiato il mio codice con l'API di posizione dei servizi di gioco di Google.Utilizzo di Google Play Services LocationClient nel servizio in background

ho creato il locationclient e collegati al servizio in onStartCommand

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

} 

e nel metodo onConnected, mando una richiesta di posizione,

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

} 

l'oggetto di richiesta è,

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

Ora il problema è,

  1. il metodo onLocationChanged non viene richiamato all'intervallo dato i.e 5 minuti o l'intervallo più veloce 3 minuti. Dal registro ho potuto vedere, è stato chiamato solo due o tre volte dopo che non è stato chiamato affatto (ho controllato dopo 1 ora).

Qual è il problema con il mio codice sopra ?. (Non riuscivo a vedere alcun log anche per "disconnesso")

  1. Per risolvere questo, ho provato a utilizzare alarmmanager per chiamare l'attività periodicamente. Ora come ottenere un singolo aggiornamento di posizione tramite Locationclient da un broadcastreceiver. (Locationclient.getLastlocation() restituisce solo ultima posizione memorizzata, ma non richiede una nuova posizione)
+0

Sto riscontrando un problema molto simile. Ho eseguito un servizio rapido e sporco che viene eseguito periodicamente con un AlarmManager e chiamo getLastLocation ogni volta. La chiamata apparentemente restituisce una posizione, ma questa posizione non viene mai aggiornata. Ho scoperto che l'apertura dell'applicazione Google Maps (probabilmente funziona con altre applicazioni in grado di rilevare la posizione) rende improvvisamente ok le posizioni ricevute dal mio aggiornamento del servizio. Qualche idea di cosa potrebbe succedere? –

+2

getlastlocation utilizza sempre provider passivi anziché GPS o provider di rete, il che significa solo quando qualsiasi altra app (come le mappe di Google) ottiene la posizione recente La nostra app userà lo stesso passivamente – ThiyagaB

+0

Vuoi solo monitorare la posizione dell'utente quando la tua app è in esecuzione o anche quando è in background? – ddewaele

risposta

35

Il codice sorgente completo di un servizio in background disponibile qui:

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

Prova ad aggiungere la chiamata eccellente al tuo 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

nice snippet & service. Grazie per la condivisione. Domanda veloce: mantieni il tuo LocationClient connesso per tutto il tempo? Se sì hai avuto problemi o disconnessioni forzate? –

+2

Non ho notato problemi con disconnessioni forzate. Uno svantaggio della potenza bilanciata, se l'utente entra in una zona morta cellulare, l'app interrompe il rilevamento della posizione finché l'utente non ha nuovamente il servizio di cella.Questo è il modo in cui è documentato per funzionare, ma dovrebbe essere preso in considerazione quando si decide tra alta precisione e potenza equilibrata. – blackcj

+0

@blackcj ha guardato il tuo codice su github ... aveva un dubbio. come posso avviare e interrompere il servizio in background da un'attività? quello che sto cercando di fare è se l'attività viene riavviata, mi piacerebbe avere un riferimento al servizio che è già in esecuzione .. Grazie. – ggauravr