Silencio de Google Iniciar sesión en el servicio de fondo Android

Estoy ejecutando un servicio de fondo en mi aplicación para Android. Utilizo el IdToken que consigo de la actividad de la muestra en la autentificación en el servidor del backend. El servicio se ejecuta en el modo START_STICKY , por lo que incluso cuando se cierra la aplicación, el servicio sigue ejecutándose en segundo plano para obtener las notificaciones del servidor back-end. El problema que estoy enfrentando es cuando el IdToken expira, no puedo renovarlo en el servicio sí mismo. La función de devolución de llamada no recibe ningún resultado si el token ha caducado. Si el token no ha expirado aún, obtiene el resultado instantáneamente.

Aquí está el código para la función signIn y la función 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(); } 

Trate de mover el

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

A antes de su declaración if. Sé que los docs de Google dicen que lo tienen de la manera en que lo hacen y hice lo mismo hasta que me di cuenta de que el ResultCallback nunca se llamará si sólo se inicializa en el bloque else, después de que opr ya ha ejecutado.

Su código debería verse así después de seguir mi sugerencia:

 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(); } 
  • No se puede iniciar la intención del servicio
  • La localización de la ubicación de Android en Service no funciona hasta que reactive WiFi / mobile network
  • Android: Obtener una instancia de un servicio en ejecución
  • Android cómo mantener la biblioteca nativa cuando la aplicación se detuvo
  • Servicio Android-Comunicación de 2 vías
  • ¿Qué significa "servicio semipúblico" en Android?
  • ¿Cómo inicio un servicio basado en un objeto ServiceInfo?
  • Detectar si mi servicio de accesibilidad está habilitado
  • Tarea del temporizador VS Uso del administrador de alarmas en el servicio de Android
  • ¿Cómo llamar a un servicio remoto Android (IPC) desde un servicio Widget / local?
  • ¿Es mala práctica usar múltiples servicios de fondo en una sola aplicación para Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.