我刚刚创建了SignIn(AppCompatActivity activity, String email, String password)
方法来登录我的Firebase Android应用中的现有用户。它使用正确的凭据工作得很完美,但是当输入错误的电子邮件和/或密码时,它无法捕获正确的异常。这是方法:
public static int SignIn(final AppCompatActivity activity, String email, String password) {
int resultTask = -2;
FirebaseUtil.mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(activity, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
if (!FirebaseUtil.mAuth.getCurrentUser().isEmailVerified()) {
FirebaseUtil.mAuth.getCurrentUser().sendEmailVerification();
FirebaseUtil.mAuth.signOut();
resultTask = 1;
} else {
FirebaseUtil.isCustom = true;
resultTask = 2;
}
} else
resultTask = -1;
}
});
return resultTask;
}
输入错误的凭据时返回-2。这个方法出了什么问题?
我通过将方法类型从int
更改为void
来解决了这个问题。原因如下:
在我的活动/片段中,我调用了像
这样的方法int result = SignInUpActivity(_params_);
注意方法的默认返回值( -2 但是在执行Firebase操作后,如登录/向上,它可以返回任何其他值)。
在此行之后,我会检查result
:
if (result == -2) {
// some stuff
}
else if (result == -1) {
// some other stuff
}
else if (result == 0) {
// ...
}
// and other value checks for result handling
目前,我没有给Firebase提供时间来获取/检查/执行自己的身份验证方法。因此,SignInUpActivity()
返回其默认值(-2)。要彻底删除头痛,我将方法类型从int
更改为void
。
我的最终代码如下:
public static void SignIn(final AppCompatActivity activity, final String email, final String password) {
FirebaseUtil.mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
/**
* Thrown when one or more of the credentials passed to a method fail to
* identify and/or authenticate the user subject of that operation.
* Inspect the error code and message to find out the specific cause.
* https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseAuthInvalidCredentialsException
*/
ProgressDialog.DismissProgressDialog();
AlertDialog.ShowAlertDialog(activity,
"Invalid credentials", "Check email and password again.",
true, "ok", null,
false, "", null,
false, -1,
true);
} else if (task.getException() instanceof FirebaseAuthInvalidUserException) {
/**
* Inspect the error code and message to find out the specific cause.
* https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseAuthInvalidUserException
*/
ProgressDialog.DismissProgressDialog();
AlertDialog.ShowAlertDialog(activity,
"Invalid credentials", "Check email and password again.",
true, "ok", null,
false, "", null,
false, -1,
true);
}
} else {
if (!FirebaseUtil.mAuth.getCurrentUser().isEmailVerified()) {
FirebaseUtil.mAuth.getCurrentUser().sendEmailVerification();
FirebaseUtil.mAuth.signOut();
ProgressDialog.DismissProgressDialog();
AlertDialog.ShowAlertDialog(activity,
"Email not verified", "To start working, please verify your email.",
true, "ok", null,
false, "", null,
true, R.drawable.ic_verified_user,
true);
} else {
FirebaseUtil.isCustom = true;
ProgressDialog.DismissProgressDialog();
}
}
}
});
}
public static void Register(final AppCompatActivity activity, final String email, final String password) {
FirebaseUtil.mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
if (task.getException() instanceof FirebaseAuthUserCollisionException) {
/**
* Thrown when an operation on a FirebaseUser instance couldn't be
* completed due to a conflict with another existing user.
* https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseAuthUserCollisionException
*/
ProgressDialog.DismissProgressDialog();
AlertDialog.ShowAlertDialog(activity,
"Try another", "This email has already registered.",
true, "ok", null,
false, "", null,
false, -1,
true);
} else {
ProgressDialog.DismissProgressDialog();
AlertDialog.ShowAlertDialog(activity,
"Whoops", "An error occurred. Try again later.",
true, "ok", null,
false, "", null,
false, -1,
true);
}
} else {
try {
FirebaseUtil.mAuth.getCurrentUser().sendEmailVerification();
FirebaseUtil.mAuth.signOut();
ProgressDialog.DismissProgressDialog();
AlertDialog.ShowAlertDialog(activity,
"The last step", "For verification, instructions sent to your email. Please, check your email.",
true, "ok", null,
false, "", null,
true, R.drawable.ic_verified_user,
true);
} catch (Exception e) {
ProgressDialog.DismissProgressDialog();
AlertDialog.ShowAlertDialog(activity,
"Whoops", "An error occurred. Try again later.",
true, "ok", null,
false, "", null,
false, -1,
true);
}
}
}
});
}
无论如何,问题解决了。
答案 0 :(得分:2)
您的方法将始终返回-2,因为您将侦听器设置为myapp.com:8000
。
设置一个监听器意味着当操作执行时,方法addOnCompleteListener
中的代码(例如)将执行。
在你的情况下,每次调用函数onComplete
时,它都会为SignIn
设置一个新的监听器,这样做的正确方法是在onCreate方法中使用该函数之外的代码,每次用户尝试登录代码中的任何位置时,addOnCompleteListener
方法中的代码都将被调用并执行。
请避免以这种方式写作,最好为听众创建一个新类,并将其称为onComplete
,确保您需要为FirebaseUtil.mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new Mylistener())
实现正确的界面}访问Mylistener
方法
编辑:
确实要执行此登录方法,您应该这样称呼它:
onComplete
然后当上面的方法执行并完成代码中的onComplete方法时,将执行。
答案 1 :(得分:2)
根据这个问题:How to catch a Firebase Auth specific exceptions
你应该检查
if (!task.isSuccessful())
但你正在做
if (task.isSuccessful())
然后你可以在try块中抛出task.getException返回的Exception,并捕获你正在使用的方法可能抛出的每种类型的Exception
答案 2 :(得分:0)
您没有收到任何异常,因为您没有在onComplete()中捕获异常。 阅读此代码供您参考。 这里是mAuth = FirebaseAuth.getInstance();
mAuth.signInWithEmailAndPassword(email,password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
// If task is successful write method which you wan to do .
Log.d(LOG_TAG, "signIn With Email:onComplete");
// If signin fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
// If task is unsuccessful then catch exception
// following are the possible exception which can occurs in signInWithEmailAndPassword().
if (!task.isSuccessful()) {
try {
throw task.getException();
} catch (FirebaseAuthInvalidUserException e) {
// show error toast to user or do something
} catch (FirebaseAuthInvalidCredentialsException e) {
// show error toast to user or do something
} catch (FirebaseNetworkException e) {
// show error toast to user or do something
} catch (Exception e) {
Log.e(LOG_TAG, e.getMessage());
}
Log.w(LOG_TAG, "signInWithEmail:failed",task.getException());
}
}
});