2014-11-04 7 views
11

Sto cercando di aggiungere funzionalità di tracciamento GPS alla mia app scrivendo un servizio di localizzazione GPS. Ho seguito i materiali degli sviluppatori Android su come farlo tramite Google Play Services, ma sono bloccato sul metodo onConnectionFailed. Sto cercando di chiamare startResolutionForResult per consentire a Google Play Services di gestire l'errore. Tuttavia questo metodo richiede che venga passata un'attività come primo parametro, e dal momento che sto chiamando da un servizio non sono veramente sicuro di cosa dovrei fare.Android: come si chiama startResolutionForResult da un servizio?

Suppongo che sto sbagliando tutto questo e c'è un modo completamente diverso di gestire questo da un servizio.

risposta

1

Il processo di autenticazione per Google Play Services richiede un'attività poiché potrebbe essere necessario visualizzare l'interfaccia utente per l'utente. Poiché i servizi non dispongono di un'interfaccia utente, è necessario inviare un messaggio a un'attività per configurare la connessione, quindi il servizio può continuare. C'è una buona risposta che dimostra un modo per farlo: Example: Communication between Activity and Service using Messaging

+1

Una soluzione così strana. Come è stato annunciato su googleIO2015 l'utente può disabilitare alcune autorizzazioni. E come il servizio dovrebbe mostrare la finestra di dialogo dell'interfaccia utente per l'utente ?! È strano. – ruX

+0

La nuova funzionalità in M ​​molto probabilmente cambierà questo comportamento. Rimanete sintonizzati! –

+0

@ClaytonWilkinson Come farlo correttamente? Dovrei semplicemente passare 'ConnectionResult' in un messaggio all'attività e poi nella chiamata all'attività' startResolutionForResult'? Questo collegherà il client API usato dal servizio, oppure il servizio chiamerà 'connect()' in seguito. Inoltre, posso essere sicuro che questo non fa trapelare l'attività alla connessione API utilizzata dal servizio? – tron

1

È possibile utilizzare Status.getResolution() e avviare Attività con esso. Per esempio:

In Service

PendingIntent pI = status.getResolution(); 
mGoogleApiClient.getContext().startActivity(new Intent(mGoogleApiClient.getContext(), SomeActivity.class) 
.putExtra("resolution", pI).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 

In Attività onCreate:

PendingIntent pI = (PendingIntent) (getIntent().getParcelableExtra("resolution")); 
startIntentSenderForResult(pI.getIntentSender(),1,null,0,0,0); 

aggiungere anche onActivityResult (int requestCode, int resultCode, dati Intent) per ricevere risultato di risoluzione