Android Studio模拟器擦除数据后Firebase无法识别已注册账号如何解决
问题原因分析
擦除模拟器数据或用户手动擦除应用数据,本身不会删除Firebase云端存储的用户账号记录,出现无对应该标识符的用户记录或FirebaseAuthInvalidUserException报错,大概率是以下原因导致:
- 擦除模拟器数据后,本地谷歌服务框架重置,无法正常连接Firebase服务,或模拟器当前连接的Firebase项目与你在控制台查看用户的项目不匹配
- 登录输入的邮箱存在多余空格、大小写和云端注册邮箱不一致的情况,Firebase Auth默认对邮箱大小写敏感
- 应用开启了Firebase电子邮件枚举保护,本地无缓存时触发了校验拦截
修复方案
即时修复(解决当前模拟器报错问题)
- 先确认模拟器网络正常,且已激活谷歌服务框架,可正常访问谷歌相关服务
- 核对当前工程内的
google-services.json文件,和你查看用户的Firebase项目配置一致,没有误连接其他测试项目 - 登录时手动确认输入的邮箱、密码和云端注册信息完全一致,避免大小写、空格误差
代码优化(用户擦除应用数据后也不会触发异常)
现有代码未对输入内容做标准化处理,也未对异常做分类适配,按以下逻辑修改即可:
- 对输入的邮箱做去空格、统一小写处理,避免格式误差
- 优化异常分支判断,给用户明确的操作提示
修改后的LogAuth方法代码如下:
private void LogAuth(){ // 邮箱输入标准化处理 String email = provided_email.getText().toString().trim().toLowerCase(); String pass = provided_pass.getText().toString(); if(!email.matches(emailPattern)) { provided_email.setError("请输入正确的邮箱格式"); } else if(pass.isEmpty() || pass.length()<6) { provided_pass.setError("请输入长度不小于6位的密码"); } else{ progressDialog.setMessage("登录处理中,请稍候..."); progressDialog.setTitle("登录"); progressDialog.setCanceledOnTouchOutside(false); progressDialog.show(); mAuth.signInWithEmailAndPassword(email,pass).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete( Task<AuthResult> task) { if(task.isSuccessful()){ progressDialog.dismiss(); sendUserToNextActivity(); Toast.makeText(MainActivity.this,"登录成功", Toast.LENGTH_SHORT).show(); } else{ progressDialog.dismiss(); // 分类处理异常 if (task.getException() instanceof FirebaseAuthInvalidUserException) { Toast.makeText(MainActivity.this,"未找到对应账号,请检查邮箱输入是否正确", Toast.LENGTH_SHORT).show(); } else if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) { Toast.makeText(MainActivity.this,"密码错误,请重试", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this,"登录失败:"+task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } } } }); } }
如果以上操作后仍有报错,可在Firebase控制台获取对应账号的用户UID,通过生成自定义令牌调用signInWithCustomToken登录,验证账号本身是否正常。
内容的提问来源于stack exchange,提问作者Don'thavetHanswers
相关产品推荐
相关产品推荐

