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.
- Cómo utilizar Android LocationManager y Listener
- Cómo grabar vídeo desde el fondo de la aplicación: Android
- REST / JSON / XML-RPC / SOAP
- BindService () devuelve false pero unbindService () necesita ser llamado?
- Android Service nunca parece iniciar - onStartCommand () no se llama
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(); }
- Temporizador Se ralentiza en Servicio cuando se bloquea la pantalla del dispositivo
- Vista web de Android dentro de un servicio?
- Uso de Google Analytics en una aplicación de Android con una actividad de interfaz de usuario y un servicio de fondo sin fin
- Dentro de una aplicación, ¿funcionará la actividad y el servicio en el mismo proceso?
- No se puede comprobar si AlarmManager ha configurado la alarma
- Escuchar el botón de volumen cuando el teléfono está bloqueado android
- Servicio en android?
- ¿Existe un equivalente GCM de Android para el servicio de comentarios de emisión Push de iOS?
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(); }
- Error "ABI no admitido" en Chrome Webview
- Android Studio: punto de interrupción en el método estático de la interfaz no funciona