2016-01-07 12 views
8

Sto eseguendo un servizio in background nella mia app Android. Io uso IdToken che ottengo dall'attività di accesso per autenticare sul server di back-end. Il servizio è in esecuzione nella modalità START_STICKY, quindi anche quando l'app viene chiusa, il servizio continua a essere eseguito in background per ricevere tutte le notifiche dal server di back-end. Il problema che sto affrontando è quando scade l'IdToken, non sono in grado di rinnovarlo nel servizio stesso. La funzione di callback non riceve alcun risultato se il token è scaduto. Se il token non è ancora scaduto, ottiene istantaneamente il risultato.Silent Google Accedi in servizio sfondo Android

Questo è il codice per la funzione signIn e la funzione handleSignIn.

private void signIn() { 
     new Thread(new Runnable() { public void run() { 
     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestEmail() 
       .requestIdToken("<My server_client_id>") 
       .build(); 
     GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(context) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 

     OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn 
       (mGoogleApiClient); 
     if (opr.isDone()) { 
      // If the user's cached credentials are valid, the OptionalPendingResult will be "done" 

      // and the GoogleSignInResult will be available instantly. 
      Log.d(TAG, "Got cached sign-in"); 
      GoogleSignInResult result = opr.get(); 
      handleSignInResult(result); 
     } else { 
      // If the user has not previously signed in on this device or the sign-in has 
      // expired, 
      // this asynchronous branch will attempt to sign in the user silently. Cross-device 
      // single sign-on will occur in this branch. 
      Log.d(TAG, "had to sign in again"); 
      opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
       @Override 
       public void onResult(GoogleSignInResult googleSignInResult) { 
        Log.d(TAG, "got result"); 
        handleSignInResult(googleSignInResult); 
       } 
      }); 
     }}}).start(); 
    } 

risposta

0

Provare a spostare il

opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
      @Override 
      public void onResult(GoogleSignInResult googleSignInResult) { 
       Log.d(TAG, "got result"); 
       handleSignInResult(googleSignInResult); 
      } 
     }); 

alla prima della sua if. So che i google doc dicono di averlo come lo fai tu e ho fatto lo stesso fino a quando ho realizzato che il ResultCallback non verrà mai chiamato se viene inizializzato solo nel blocco else, dopo che opr è già stato eseguito.

Il codice dovrebbe essere simile a questo, dopo aver seguito il mio suggerimento:

private void signIn() { 
    new Thread(new Runnable() { public void run() { 
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestEmail() 
      .requestIdToken("<My server_client_id>") 
      .build(); 
    GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(context) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 

    OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn 
      (mGoogleApiClient); 
    opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
      @Override 
      public void onResult(GoogleSignInResult googleSignInResult) { 
       Log.d(TAG, "got result"); 
       handleSignInResult(googleSignInResult); 
      } 
     });}}).start(); 
} 
0

avuto lo stesso problema, quindi ecco le mie scoperte finora.

Prima che il token scada, il processo di accesso in realtà non utilizza il client dell'API di Google.

Se il token è scaduto, il client API di Google viene utilizzato e deve essere connesso quando si chiama silentSignIn(). È possibile connetterlo manualmente con blockingConnect() o automaticamente con enableAutoManage() (se si è impegnati in un'attività).

Quindi nel tuo caso sembra che tu debba almeno connettere il cliente.

Ma c'è di più ... Se il token ID è scaduto, il processo di accesso implica la ricezione di un risultato di attività, che è possibile eseguire solo in un'attività, non in un servizio.

Problemi correlati