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

如何检测用户输入错误的OTP并展示报错提示避免App发生崩溃

OTP错误校验及崩溃修复实现方案

崩溃原因排查

当前App崩溃大概率是两个问题导致的:

  • 身份校验失败的分支没有关闭proceedProgressDialog,造成窗口泄漏异常
  • 没有捕获任务执行抛出的异常,未做异常兜底处理

实现步骤

你需要在// Here I want to show wrong otp error注释的位置补充以下逻辑:

  1. 先关闭正在显示的进度弹窗
  2. 获取任务异常的错误码,判断是否为无效OTP的场景
  3. 对应场景给用户弹出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:54:03