You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中Firebase Auth修改密码时应用崩溃求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:32:21