2016-01-07 12 views
8

Ich habe einen Hintergrund-Service in meiner Android-App. Ich verwende das IdToken, das ich von der Anmeldeaktivität erhält, um mich am Backend-Server zu authentifizieren. Der Dienst wird im Modus START_STICKY ausgeführt. Selbst wenn die App geschlossen wird, läuft der Dienst im Hintergrund weiter, um Benachrichtigungen vom Back-End-Server zu erhalten. Das Problem, vor dem ich stehe, ist, wenn das IdToken abläuft, ich kann es nicht im Dienst selbst erneuern. Die Rückruffunktion erhält kein Ergebnis, wenn das Token abgelaufen ist. Wenn das Token noch nicht abgelaufen ist, erhält es sofort das Ergebnis.Silent Google Anmelden in Android-Hintergrund-Service

Hier ist der Code für die SignIn-Funktion und die HandleSignIn-Funktion.

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(); 
    } 

Antwort

0

Versuchen Sie, die

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

, bevor seine if-Anweisung zu bewegen. Ich weiß, dass die Google Docs sagen, dass es so ist, wie Sie es tun, und ich habe dasselbe gemacht, bis ich feststellte, dass der ResultCallback niemals aufgerufen wird, wenn er erst im else-Block initialisiert wird, nachdem opr bereits ausgeführt wurde.

Der Code sollte wie folgt aussehen nach meinem Vorschlag folgt:

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

das gleiche Problem Erhielt, so hier sind meine Ergebnisse so weit.

Bevor der Token abläuft, verwendet der Anmeldevorgang nicht den Google API-Client.

Wenn das Token abgelaufen ist, wird der Google API-Client verwendet und muss beim Aufruf von silentSignIn() verbunden werden. Sie können es manuell mit blockingConnect() oder automatisch mit enableAutoManage() verbinden (wenn Sie in einer Aktivität sind).

In Ihrem Fall sieht es so aus, als sollten Sie zumindest den Client verbinden.

Aber es gibt noch mehr ... Wenn das ID-Token abgelaufen ist, beinhaltet der Anmeldevorgang das Empfangen eines Aktivitätsergebnisses, das Sie nur in einer Aktivität und nicht in einem Dienst ausführen können.

Verwandte Themen