Ho fatto qualcosa di simile da un app che ha un'attività e uno SyncService. È possibile visualizzare molte funzionalità nel demo here. Questa demo non utilizza un servizio, ma l'idea rimane la stessa.
1/Creare una classe singleton (GDAA in questo caso) con un metodo init() che accetta il contesto delle attività. Questo init()
crea un'istanza locale statica GoogleApiClient
che rimane attiva finché non è necessario cambiare account (spiegato in seguito).
init()
è chiamato con un contesto di attività all'inizio o quando v'è la necessità di passare ad un altro account utente (GooDrive differente per utente). L'attività passa nel suo contesto e fornisce i callback onConnFail(), onConnOK()
.
Per motivi di completezza, dovrebbe essere prevista anche una disposizione per onConnectionSuspended()
in caso di interruzione della connessione (non una caduta di connessione WIFI/CELL, ma sospensione di GooPlaySvcs).
- Il
onConnFail()
richiamata passa il controllo al GooPlaySvcs per l'autenticazione/autorizzazione il cui risultato torna in onActivityResult()
. Collegare di nuovo, lavare, risciacquare, ripetere ...
- Il
onConnOK()
richiamata dice la vostra attività che tutto è pronto.
Come ho sottolineato, si dovrà chiamare il init()
di nuovo se si gestisce più account GooDrive al fine di creare un nuovo GoogleApiClient
per un nuovo account. Segui semplicemente la traccia 'REQ_ACCPICK' here. Dovrai inoltre gestire i tuoi account come puoi vedere nella classe "AM" del gestore account here. La maggior parte di questa danza può essere vista nello MainActivity.
Per completezza, devo anche ricordare che è possibile lasciare la gestione degli account a GooPlaySvcs omettendo lo setAccountName(email)
nel GoogleApiClient.Builder()
e utilizzare clearDefaultAccountAndReconnect()
per reimpostare la scelta dell'account. Ma la tua app non saprà chi è l'utente corrente. Un'altra gestione degli account può essere gestita tramite PlusApi (o come si chiama, mai utilizzato). Ma sto divagando.
2/Quando l'inizializzazione è fatto e la statica GoogleApiClient mGAC
privato non è nullo ed è collegato, metodi statici GdaÅ possibile fare riferimento a qualsiasi punto della app, tra cui un servizio . I metodi certamente fallire se il GoogleApiClient non è vivo o non collegato.
Nella demo menzionato qui, tutte le chiamate GdaÅ sono del (sincronizzazione) sapore 'attendere()'. Non è un problema se vengono chiamati da un thread non UI come un servizio. Essi possono essere facilmente trasformati in versioni asincrone come in questo esempio:
DriveFile df = ...;
// sync version
DriveContentsResult rslt = df.open(mGAC, DriveFile.MODE_READ_ONLY, null).await();
if ((rslt != null) && rslt.getStatus().isSuccess()) {
DriveContents cont = rslt.getDriveContents();
InputStream is = cont.getInputStream();
cont.discard(mGAC); // or cont.commit(); they are equiv if READONLY
}
// async version
df.open(mGAC, DriveFile.MODE_READ_ONLY, null).setResultCallback(
new ResultCallback<DriveContentsResult>() {
@Override
public void onResult(DriveContentsResult rslt) {
if ((rslt != null) && rslt.getStatus().isSuccess()) {
DriveContents cont = rslt.getDriveContents();
InputStream is = cont.getInputStream();
cont.discard(mGAC); // or cont.commit(); they are equiv if READONLY
}
}
});
Il sapore dipende dalle esigenze vi app (spaghetti code con valori di ritorno consumate contro l'elaborazione asincrona).
Va ricordato, che questa demo utilizza la versione GDAA delle API. C'è un REST Api così che può essere gestito allo stesso modo (solo sapore di sincronizzazione). Una demo alternativa che utilizza esattamente la stessa logica e i metodi è disponibile here. È anche possibile combinare la classe due in uno Singleton sia con
com.google.api.services.drive.Drive
e com.google.android.gms.common.api.GoogleApiClient
presente.
È pericoloso mescolare GDAA e REST Api, dal momento che si incontreranno sicuramente problemi di temporizzazione causati dal fatto che GDAA si sincronizza sulla propria pianificazione, mentre REST è sotto il vostro controllo.
Speranza ha aiutato, Good Luck
fa la vostra applicazione ha google plus login –
@war_Hero: um, si suppone che il login per essere istigata dalle API di Google Drive. Questo è il punto della mia domanda: come gestirlo in modo pulito dall'esterno del contesto di un'attività. –
la ragione y ho chiesto era di sapere se avete g + login poi ri-autenticazione non è richiesta –