android firebase firebase-authentication

android - ¿Cómo puedo detectar si el usuario es la primera vez en Firebase[duplicado]?



firebase-authentication (4)

¿Cómo puedo detectar si el usuario es la primera vez en Firebase?

Si desea comprobar si el usuario inicia sesión por primera vez, es lo mismo si comprueba si un usuario es nuevo. Así que para resolver esto, simplemente puede llamar al método isNewUser() de isNewUser() :

Devuelve si el usuario es nuevo o existente

En la OnCompleteListener.onComplete llamada OnCompleteListener.onComplete como esta:

OnCompleteListener<AuthResult> completeListener = new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser(); if (isNewUser) { Log.d("TAG", "Is New User!"); } else { Log.d("TAG", "Is Old User!"); } } } };

Para más información, consulte la documentación oficial .

Editar: para que funcione, debe agregar un escucha completo. Por favor, consulte el siguiente código:

mAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser(); if (isNewUser) { Log.d(TAG, "Is New User!"); } else { Log.d(TAG, "Is Old User!"); } } });

O incluso más simple:

mAuth.signInWithCredential(credential).addOnCompleteListener(this, completeListener);

En el cual, el objeto completeListener es el objeto que se definió primero.

Necesito verificar si el usuario está iniciando sesión por primera vez, e inicializar su cuenta con propiedades adicionales (puntos, membresía, etc.) si es verdadero.

El usuario puede cambiar su dispositivo y quiere iniciar sesión nuevamente en otro dispositivo.

Estoy usando el método de inicio de sesión de Google. Probé algo como esto.

if(FirebaseAuth.getInstance().getCurrentUser() != null){ Toast.makeText(Anamain.this, "Welcome again xyz", Toast.LENGTH_SHORT).show(); }

Me inscribo con una cuenta nueva, así que es la primera vez en esta aplicación, pero de todos modos aparece el mensaje "Bienvenido de nuevo xyz".

¿Cómo puedo detectar si el usuario existe en la base de datos antes?

Codigo completo

package com.mertg.testsignin; import android.content.Intent; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.signin.GoogleSignIn; import com.google.android.gms.auth.api.signin.GoogleSignInAccount; import com.google.android.gms.auth.api.signin.GoogleSignInClient; import com.google.android.gms.auth.api.signin.GoogleSignInOptions; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.SignInButton; import com.google.android.gms.common.api.ApiException; import com.google.android.gms.common.api.CommonStatusCodes; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks; import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.GoogleAuthProvider; import com.google.firebase.database.FirebaseDatabase; public class Anamain extends AppCompatActivity { private String TAG = "Anamain"; private SignInButton signIn; GoogleSignInClient mGoogleSignInClient; private int RC_SIGN_IN = 1; private FirebaseAuth mAuth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_anamain); signIn = (SignInButton)findViewById(R.id.googleBtn); mAuth = FirebaseAuth.getInstance(); // Configure sign-in to request the user''s ID, email address, and basic // profile. ID and basic profile are included in DEFAULT_SIGN_IN. GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build(); mGoogleSignInClient = GoogleSignIn.getClient(this, gso); signIn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { signIn(); } }); } private void signIn() { Intent signInIntent = mGoogleSignInClient.getSignInIntent(); startActivityForResult(signInIntent, RC_SIGN_IN); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); if (requestCode == RC_SIGN_IN) { Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); try { // Google Sign In was successful, authenticate with Firebase GoogleSignInAccount account = task.getResult(ApiException.class); firebaseAuthWithGoogle(account); } catch (ApiException e) { // Google Sign In failed, update UI appropriately Log.w(TAG, "Google sign in failed", e); // ... } } } private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { Log.d("TAG", "signInWithCredential:success" + acct.getId()); AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); mAuth.signInWithCredential(credential) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { /* if (!task.isSuccessful()){ Log.d("TAG", "signInWithCredential:success"); FirebaseUser user = mAuth.getCurrentUser(); updateUI(user); }*/ if(FirebaseAuth.getInstance().getCurrentUser() != null){ Toast.makeText(Anamain.this, "Welcome again xyz", Toast.LENGTH_SHORT).show(); } else { //Log.w("TAG", "signInWithCredential:failure", task.getException()); // Toast.makeText(Anamain.this, "Basaramadim", Toast.LENGTH_SHORT).show(); //updateUI(null); Toast.makeText(Anamain.this, "Register Successful", Toast.LENGTH_SHORT).show(); FirebaseUser user = mAuth.getCurrentUser(); //updateUI(user); } } }); } private void updateUI(FirebaseUser user) { GoogleSignInAccount acct = GoogleSignIn.getLastSignedInAccount(getApplicationContext()); if(acct != null) { String personName = acct.getDisplayName(); Toast.makeText(this, "Sen Girdin" + personName, Toast.LENGTH_SHORT).show(); } } }

ACTUALIZAR

Me sale error: '';'' esperado para esta linea

mAuth.signInWithCredential(credential)

Así es como me sustituyo.

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { Log.d("TAG", "signInWithCredential:success" + acct.getId()); AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); mAuth.signInWithCredential(authCredential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser(); if (isNewUser) { Log.d(TAG, "Is New User!"); } else { Log.d(TAG, "Is Old User!"); } } }); }


Haga un tipo de indicador isFirstTime = false en la base de datos. Cuando la aplicación se instala por primera vez, configúrela como true .


Puede tener un user node en su base de datos en el que puede agregar la key como uuid y valor como su uuid único. Si su usuario llega por primera vez, no obtendrá el uuid en el nodo de usuario y, por lo tanto, puede agregar uuid allí con la inicialización de tu usuario en la base de datos


Solo para compartir mi implementación anterior sobre el nuevo problema de usuario.

He usado Firebase Cloud Firestore en mi proyecto, así que he creado otra tabla para almacenar la información básica de mis usuarios.

Primero, creo un método, a saber, createUser() pero básicamente, comprueba si es un usuario por primera vez consultando la base de datos Firebase Cloud Firestore. Si no existe, cree un documento para el usuario, y puede realizar su acción hacia ellos, busque //you can add some action here en el código a continuación.

A continuación se muestra el código real de mi proyecto anterior, que incluye una Administración basada en roles para controlar el acceso de los usuarios (solo para su referencia, si está interesado).

public void createUser(){ docRef = mFirestore.collection("users").document(auth.getCurrentUser().getUid()); docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { @Override public void onComplete(@NonNull Task<DocumentSnapshot> task) { if (task.isSuccessful()) { DocumentSnapshot document = task.getResult(); //if the user is already in the database, check the user role if (document != null && document.exists()) { User user = document.toObject(User.class); if(user.getRoles().get("admin")==true){ Log.d(TAG, "Admin: true"); btn_admin.setVisibility(View.VISIBLE); } else{ Log.d(TAG, "Admin: false"); btn_admin.setVisibility(View.GONE); } Log.d(TAG, "DocumentSnapshot data: " + document.getData()); } else { //check whether it''s a new user //if yes, create a new document containing the user details thru my User model Log.d(TAG, "No such document"); btn_admin.setVisibility(View.GONE); Map<String, Boolean> roles = new HashMap<>(); roles.put("editor", false); roles.put("viewer", false); roles.put("admin", false); User user = new User(auth.getCurrentUser().getDisplayName(), auth.getCurrentUser().getUid(),auth.getCurrentUser().getEmail(), roles); //you can add some action here mFirestore.collection("users").document(auth.getCurrentUser().getUid()) .set(user, SetOptions.merge()) .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Log.d(TAG, "DocumentSnapshot successfully written!"); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "Error writing document", e); } }); //Log.d(TAG, "Created credential"); } } else { Log.d(TAG, "get failed with ", task.getException()); } } }); }