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