如何检测用户输入错误的OTP并展示报错提示避免App发生崩溃
OTP错误校验及崩溃修复实现方案
崩溃原因排查
当前App崩溃大概率是两个问题导致的:
- 身份校验失败的分支没有关闭
proceedProgressDialog,造成窗口泄漏异常 - 没有捕获任务执行抛出的异常,未做异常兜底处理
实现步骤
你需要在// Here I want to show wrong otp error注释的位置补充以下逻辑:
- 先关闭正在显示的进度弹窗
- 获取任务异常的错误码,判断是否为无效OTP的场景
- 对应场景给用户弹出Toast提示,同时可做后续交互兜底(比如清空输入框让用户重新输入)
修改后的完整代码片段
private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) { auth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { proceedProgressDialog.dismiss(); FirebaseUser user = auth.getCurrentUser(); String currentUserMobile = user.getPhoneNumber(); CollectionReference reference = FirebaseFirestore.getInstance().collection("Users"); Query query = reference.whereEqualTo("Mobile", currentUserMobile); query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { for (DocumentSnapshot snapshot : task.getResult()) { String userCred = snapshot.getString("Mobile"); if (userCred.equals(currentUserMobile)) { if (user != null) { SharedPreferences.Editor editor = preferences.edit(); editor.putString(KEY_MOBILE, currentUserMobile); editor.commit(); Intent intent = new Intent(LoginActivity.this, DashboardActivity.class); startActivity(intent); finishAffinity(); } } } } if (task.getResult().size() == 0) { Toast.makeText(LoginActivity.this, "用户不存在", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(LoginActivity.this, AdditionalDetailsActivity.class); startActivity(intent); finish(); } } }); } else { // 先关闭进度弹窗,避免窗口泄漏导致崩溃 if (proceedProgressDialog != null && proceedProgressDialog.isShowing()) { proceedProgressDialog.dismiss(); } // 捕获异常判断错误类型 if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) { // OTP校验失败场景 Toast.makeText(LoginActivity.this, "输入的验证码错误,请重新输入", Toast.LENGTH_SHORT).show(); // 可选补充:清空OTP输入框,让用户直接重新输入 // otpEditText.setText(""); } else { // 其他错误场景兜底提示 Toast.makeText(LoginActivity.this, "登录失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } } } }); }
额外注意事项
- 必须加非空判断防止
proceedProgressDialog为空时报空指针异常 - 如果需要限制OTP重试次数,可以在错误分支里累加重试次数,达到阈值后禁用输入或者触发验证码重新发送逻辑
内容的提问来源于stack exchange,提问作者gauravmandall
相关产品推荐
相关产品推荐

