2016-01-07 12 views
8

Mam uruchomioną usługę w tle w mojej aplikacji na Androida. Używam IdentToken, który otrzymuję od działania logowania, aby uwierzytelnić się na serwerze zaplecza. Usługa działa w trybie START_STICKY, więc nawet gdy aplikacja jest zamknięta, usługa działa nadal w tle, aby otrzymywać wszelkie powiadomienia z serwera zaplecza. Problem, z którym borykam się, to koniec ważności identyfikatora, nie mogę go odnowić w samej usłudze. Funkcja zwrotna nie otrzyma żadnego wyniku, jeśli token wygasł. Jeśli token jeszcze nie wygasł, natychmiast otrzymuje wynik.Cichy Google Zaloguj się w tle usługi Android

Oto kod funkcji signIn i funkcji 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(); 
    } 

Odpowiedz

0

Spróbuj przesunąć

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

do przed jego if. Wiem, że doktorzy Google mówią, że robią to tak, jak robisz i robiłem to samo, dopóki nie zdałem sobie sprawy, że ResultCallback nigdy nie zostanie wywołany, jeśli zostanie zainicjowany tylko w bloku else, po tym, jak opr już działa.

Kod powinien wyglądać po wykonaniu moja propozycja:

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

Mam ten sam problem, więc tutaj są moje ustalenia tej pory.

Przed wygaśnięciem tokenu proces logowania w rzeczywistości nie korzysta z klienta Google API.

Jeśli token wygasł, używany jest klient interfejsu API Google i musi on zostać podłączony podczas wywoływania funkcji silentSignIn(). Możesz połączyć go ręcznie z blockingConnect() lub automatycznie z enableAutoManage() (jeśli jesteś w działaniu).

W twoim przypadku wygląda na to, że powinieneś przynajmniej podłączyć klienta.

Ale jest więcej ... Jeśli token identyfikacyjny wygasł, proces logowania obejmuje otrzymanie wyniku działania, który można wykonać tylko w działaniu, a nie w usłudze.

Powiązane problemy