Android Studio中Firebase Auth修改密码时应用崩溃求助
Android Studio Java环境下,调用Firebase Auth更新用户密码时应用崩溃,相关日志及代码如下:
崩溃日志
win=Window{c86f864 u0 com.example.finalprojectorisamarel/com.example.finalprojectorisamarel.ChangePasswordActivity} destroySurfaces: appStopped=true cleanupOnResume=false win.mWindowRemovalAllowed=false win.mRemoveOnExit=false win.mViewVisibility=8 caller=com.android.server.wm.ActivityRecord.destroySurfaces:6539 com.android.server.wm.ActivityRecord.destroySurfaces:6520 com.android.server.wm.ActivityRecord.notifyAppStopped:6584 com.android.server.wm.ActivityRecord.activityStopped:7172 com.android.server.wm.ActivityClientController.activityStopped:258 android.app.IActivityClientController$Stub.onTransact:613 com.android.server.wm.ActivityClientController.onTransact:136
问题代码
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); user.updatePassword(etAgain.getText().toString()) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(ChangePasswordActivity.this, "Password update", Toast.LENGTH_SHORT).show(); finish(); } else { Toast.makeText(ChangePasswordActivity.this, "Error, password not updated", Toast.LENGTH_SHORT).show(); } } });
排查与修复方案
1. 获取真实崩溃异常
你提供的日志是系统窗口销毁日志,未包含崩溃核心原因。打开Android Studio的Logcat,过滤Error/Exception级别日志,找到崩溃时抛出的具体异常(比如空指针、Firebase权限异常等)。
2. 修复代码中的常见问题
(1)避免空指针崩溃
FirebaseAuth.getInstance().getCurrentUser()可能返回null(用户未登录或会话过期),直接调用updatePassword会触发空指针崩溃,先做非空判断:
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); if (user != null) { String newPassword = etAgain.getText().toString().trim(); user.updatePassword(newPassword) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { // 原有回调逻辑 } }); } else { Toast.makeText(ChangePasswordActivity.this, "用户未登录", Toast.LENGTH_SHORT).show(); }
(2)处理密码格式与具体错误
Firebase要求密码至少6位,若输入不符合要求会抛出异常。在回调中获取具体错误信息,方便排查:
} else { String errorMsg = task.getException() != null ? task.getException().getMessage() : "未知错误"; Toast.makeText(ChangePasswordActivity.this, "更新失败:" + errorMsg, Toast.LENGTH_SHORT).show(); }
(3)处理重新验证要求
如果用户长时间未登录,Firebase会要求重新验证身份才能修改密码(抛出FirebaseAuthRecentLoginRequiredException),需先完成重新验证再更新密码:
} else { Exception exception = task.getException(); if (exception instanceof FirebaseAuthRecentLoginRequiredException) { // 以邮箱验证为例,需要用户输入当前密码 String userEmail = user.getEmail(); if (userEmail != null) { // 可弹出输入框让用户输入当前密码 String currentPassword = "用户输入的当前密码"; EmailAuthProvider credential = EmailAuthProvider.getCredential(userEmail, currentPassword); user.reauthenticate(credential) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> reauthTask) { if (reauthTask.isSuccessful()) { // 重新验证成功,再次执行密码更新 user.updatePassword(etAgain.getText().toString().trim()) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> updateTask) { if (updateTask.isSuccessful()) { Toast.makeText(ChangePasswordActivity.this, "密码更新成功", Toast.LENGTH_SHORT).show(); finish(); } else { String updateError = updateTask.getException() != null ? updateTask.getException().getMessage() : "更新失败"; Toast.makeText(ChangePasswordActivity.this, updateError, Toast.LENGTH_SHORT).show(); } } }); } else { String reauthError = reauthTask.getException() != null ? reauthTask.getException().getMessage() : "验证失败"; Toast.makeText(ChangePasswordActivity.this, reauthError, Toast.LENGTH_SHORT).show(); } } }); } } else { String errorMsg = exception != null ? exception.getMessage() : "未知错误"; Toast.makeText(ChangePasswordActivity.this, "更新失败:" + errorMsg, Toast.LENGTH_SHORT).show(); } }
内容的提问来源于stack exchange,提问作者ori

