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