2015-12-15 11 views
13

E 'possibile l'integrazione con Google Drive, senza crearne di propria attività, invece usando solo l'attività corrente per l'applicazione senza inquinare con codice relativo Google Drive?integrazione di Google Drive utilizzando l'attività corrente

Ho una formazione di "servizio" (non un servizio di Android - solo una classe UI agnostico), che è responsabile del caricamento di alcuni dati da Google Drive. Come servizio, non è un vero affare essere un'attività. Tuttavia, lo samples for Drive integration ha un override di onActivityResult per gestire la situazione in cui è richiesta l'autenticazione. Non sono sicuro di come ottenere queste informazioni se il mio servizio non è implementato come attività.

Supponendo di poter ottenere un riferimento all'attuale Activity dal mio "servizio", c'è un modo per implementare l'integrazione di Google Drive in modo completamente autonomo?

+0

fa la vostra applicazione ha google plus login –

+0

@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à. –

+0

la ragione y ho chiesto era di sapere se avete g + login poi ri-autenticazione non è richiesta –

risposta

6

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

6

Il percorso del codice onActivityResult viene utilizzato solo quando è presente un errore di autenticazione che richiede l'intervento dell'utente. Quindi, per definizione, non può essere semplicemente gestito "in background" dal tuo servizio.

Nel caso del servizio in background, penso che un modo appropriato per gestire errori di autenticazione è quello di mostrare un messaggio che indica l'effetto di "È necessario autenticarsi per continuare". È possibile allegare un Intento alla notifica in modo che venga avviata la propria "ResolveAuthActivity" quando l'utente tocca la notifica. Questa ResolveAuthActivity tenta semplicemente di connettersi all'API, gestisce l'errore in onConnectionFailed e quindi lancia l'Intento di risoluzione. Una volta risolto l'errore, ResolveAuthActivity può attirare il tuo servizio per provare a connettersi nuovamente all'API.

+0

Il campione sembra contraddire la tua prima affermazione. Cioè, sta gestendo l'autenticazione _successo_, non il fallimento. https://github.com/googledrive/android-demos/blob/master/app/src/main/java/com/google/android/gms/drive/sample/demo/BaseDemoActivity.java#L98 –

+0

È gestire un risoluzione di autenticazione riuscita * dopo * un precedente errore di connessione. Se si nota, REQUEST_CODE_AUTHENTICATION viene avviato dall'interno di onConnectionFailed e onActivityResult viene chiamato dopo il completamento di REQUEST_CODE_AUTHENTICATION. Pertanto, il flusso di codice completo è il seguente: 1. Prova a connetterti utilizzando GoogleApiClient.connect, 2. Se la connessione non è riuscita (ovvero, onConnectionFailed viene chiamato), avvia la risoluzione di autenticazione, 3. Gestisci il risultato della risoluzione in onActivityResult. Se non si è verificato alcun errore su (1), non si andrebbe affatto al flusso onActivityResult. – Prima

Problemi correlati