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.
Esta pregunta ya tiene una respuesta aquí:
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());
}
}
});
}