Cómo lidiar con el inicio en frío de una aplicación donde el usuario ha iniciado sesión con Firebase en la ejecución anterior

Gracias a Firebase el usuario puede iniciar sesión con la ayuda de G +, Facebook o Twitter. Cuando se registran, todo está bien.

Cuando la aplicación de Android se cierra y se vuelve a abrir, cómo volver a habilitar el usuario registrado anterior con la API de Firebase. No se explica ni en la demostración de la aplicación ni en la documentación.

Por ejemplo para Facebook, el sdk parece guardar el token, es por eso que el botón está en estado conectado (mostrando que se puede desconectar). Pero ¿qué pasa con Firebase y otros sistemas de autenticación?

Gracias a la respuesta @ Frank-van-Puffelen, tuve algunos ensayos hasta que consigo algo relevante (al menos para mí: comentario son bienvenidos para mejorar).

He basado mi arquitectura OAuth en 3 componentes principales: fdsfds

  1. Un único AuthStateListener que se encuentra en la aplicación.
  2. One Utils Singleton OAuthManager que se ocupa de todo el proceso de autenticación
  3. Una o varias actividades que se ocupan de la interacción del usuario de autentificación (botones de inicio de sesión y así sucesivamente)

Clase de aplicación

FacebookSdk.sdkInitialize(this); Firebase.setAndroidContext(this); Firebase.getDefaultConfig().setLogLevel(Logger.Level.DEBUG); Firebase.getDefaultConfig().setPersistenceEnabled(true); Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com"); ref.addAuthStateListener(new Firebase.AuthStateListener() { @Override public void onAuthStateChanged(AuthData authData) { if (authData != null) { // user is logged in // create a partialUser from authData OAuthManager.getDefault().setAuthenticatedUser(authData); // fetch, merge and save back the partialUser with server registerUser. OAuthManager.getDefault().startFetchingUserInfo(); } else { // user is not logged in // Try to retrieve the user from Facebook SDK // Try to retrieve the user from "Token and Id save in Android Preferences (in case of issue, or cache reset from Firebase)) // In retrieve is not possible, clean auth data OAuthManager.getDefault().retrieveOAuth(MilleZimU.getInstance()); } } }); 

OAuthManager

Aquí están todos los servicios que se ocupan de la autentificación (parte ha sido copia de la actividad de demostración dedicada de Firebase)

SignInActivity

Aquí sólo quedan la parte que se ocupan de la interacción de la interfaz de usuario.

Retreiving?

No estoy seguro de que esto sea necesario, pero caso a caso (tal vez debido a un fallo o actualización de la aplicación), el estado de autenticación es diferente de Firebase | Prefs | FacebookSdk. Veré con el tiempo.

Deberá agregar un AuthStateListener . Esto se describe en la documentación de Firebase sobre la supervisión de la autenticación . Desde allí:

 Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com"); ref.addAuthStateListener(new Firebase.AuthStateListener() { @Override public void onAuthStateChanged(AuthData authData) { if (authData != null) { // user is logged in } else { // user is not logged in } } }); 

Para cualquier cosa relacionada con la autenticación Firebase en Android, la aplicación de demostración dedicada es una gran parada. Pero asegúrese de leer primero la documentación, que no son la mitad malo en cuanto a los documentos.

Cree una clase BaseActivity y asegúrese de que todas las demás actividades de la aplicación amplíen esa clase. El uso de "instanceOf" para enviar al usuario a LoginActivity si authData es nulo de AuthListener.

 package com.mabiri.mabiristores; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.firebase.client.AuthData; import com.firebase.client.Firebase; import com.mabiri.mabiristores.login.CreateAccount2Activity; import com.mabiri.mabiristores.login.CreateAccountActivity; import com.mabiri.mabiristores.login.LoginActivity; import com.mabiri.mabiristores.login.MapsActivity; import com.mabiri.mabiristores.utils.Utils; public class BaseActivity extends AppCompatActivity { protected Firebase.AuthStateListener mAuthListener; protected Firebase mFirebaseRef; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mFirebaseRef = new Firebase(YOUR_FIREBASE_URL); if (!((this instanceof LoginActivity) || (this instanceof CreateAccountActivity) || (this instanceof CreateAccount2Activity) || (this instanceof MapsActivity))) { mAuthListener = new Firebase.AuthStateListener() { @Override public void onAuthStateChanged(AuthData authData) { /* The user has been logged out */ if (authData == null) { //Stop services and clear sharedPreferences if any /*Take user to login screen*/ takeUserToLoginScreenOnUnAuth(); } } }; mFirebaseRef.addAuthStateListener(mAuthListener); } } @Override protected void onResume() { super.onResume(); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { super.onBackPressed(); return true; } return super.onOptionsItemSelected(item); } @Override public boolean onCreateOptionsMenu(Menu menu) { /* Inflate the menu; this adds items to the action bar if it is present. */ getMenuInflater().inflate(R.menu.menu_base, menu); return true; } private void takeUserToLoginScreenOnUnAuth() { /** Move user to LoginActivity, and remove the backstack */ Intent intent = new Intent(BaseActivity.this, LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); finish(); } protected void logout() { /**Unauthenticate user from firebase*/ mFirebaseRef.unauth(); } /** * Show error toast to users */ protected void showErrorToast(Context context, String message) { Toast.makeText(context, message, Toast.LENGTH_LONG).show(); } 

}

Yup tengo lucha con esto también, pero una actualización rápida sobre este tema, no se puede utilizar el (y por favor, corrija si estoy equivocado):

 Firebase ref 

lo que debe hacer es declararse como un

 private FirebaseAuth mAuth; 

y luego utilizar este objeto en el oyente:

  mAuth = FirebaseAuth.getInstance(); 

y sólo después de que usted puede utilizar el oyente

  mAuth.addAuthStateListener(mAuthListener); 
  • Firebase - Correo de verificación de correo electrónico No funciona - Se ha producido un error interno.
  • Descripción de la función createUser de firebase (específicamente la biblioteca android)
  • Firebase Error no puede tener acceso a zzanb después de usar play-services-xxx: 9.8.00
  • Cambiar contraseña con Firebase para Android
  • Vaciar el campo de correo electrónico de Firebase Auth Usuario que utiliza Integración de inicio de sesión de Facebook (Firebase 3.0)
  • ¿Cómo volver a autenticar un usuario en Firebase con Google Provider?
  • Verificación de correo electrónico con Firebase 3.0 en Android
  • ¿Cómo puedo deshabilitar las cuentas de usuario de un proyecto de firebase desde el código?
  • Firebase setDisplayName del usuario al crear el usuario Android
  • Corregir la ubicación del código para comprobar Firebase si ya se ha creado un usuario?
  • FirebaseAuth.getCurrentUser () devuelve null DisplayName
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.