Android Firebase登录跳转应用崩溃问题求助
Android Firebase登录崩溃且页面不跳转问题
问题描述
我开发的Android应用需登录后跳转至其他页面,使用Firebase数据库存储用户数据。输入账号密码点击登录按钮后,页面未跳转且应用崩溃,调整登录按钮点击逻辑后问题仍存在。
原登录页面代码
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); loginemail = (EditText) findViewById(R.id.email); loginpassword = (EditText) findViewById(R.id.password); generatorBtn = (Button) findViewById(R.id.idBtnGenerator); RegistrationBtn = (Button) findViewById(R.id.register); generatorBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (!validateEmail() | !validatePassword()) { return; } else if(validateEmail() && validatePassword()) { checkUser(); } else { Toast.makeText(getApplicationContext(), "Успешно", Toast.LENGTH_SHORT).show(); Intent i = new Intent(ActivityLogin.this, GeneratorQRcodeActivity.class); startActivity(i); } } }); RegistrationBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(ActivityLogin.this, RegistrationActivity.class); startActivity(i); } }); } public Boolean validateEmail() { String val = loginemail.getText().toString(); if (val.isEmpty()) { loginemail.setError("Адрес электронной почты не заполнен"); return false; } else { loginemail.setError(null); return true; } } public Boolean validatePassword() { String val = loginpassword.getText().toString(); if (val.isEmpty()) { loginpassword.setError("Пароль не заполнен"); return false; } else { loginpassword.setError(null); return true; } } public void checkUser() { String userLoginEmail = loginemail.getText().toString().trim(); String userPassword = loginpassword.getText().toString().trim(); DatabaseReference reference = FirebaseDatabase.getInstance().getReference("users"); Query checkUserDatabase = reference.orderByChild("email").equalTo(userLoginEmail); checkUserDatabase.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()) { loginemail.setError(null); String passwordFromDB = snapshot.child(userLoginEmail).child("password").getValue(String.class); if (!Objects.equals(passwordFromDB, userPassword)) { loginemail.setError(null); } else { loginpassword.setError("Недопустимая форма учетной записи"); loginpassword.requestFocus(); } } else { loginemail.setError("Пользователь не существует"); loginemail.requestFocus(); } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); }
修改后的登录按钮逻辑
generatorBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (!validateEmail() | !validatePassword()) { return; } else if(validateEmail() && validatePassword()) { checkUser(); } else { Toast.makeText(getApplicationContext(), "Успешно", Toast.LENGTH_SHORT).show(); Intent i = new Intent(ActivityLogin.this, GeneratorQRcodeActivity.class); startActivity(i); } } });
Logcat日志(翻译后)
2024-03-12 15:10:56.877 1699-7807 WindowManager system_server E 窗口=Window{e2fc2f4 u0 com.example.scannerandgenerator/com.example.scannerandgenerator.RegistrationActivity} 销毁Surface:应用已停止=true 恢复时清理=false 窗口允许移除=false 窗口退出时移除=false 窗口视图可见性=8 调用方=com.android.server.wm.ActivityRecord.destroySurfaces:6862 com.android.server.wm.ActivityRecord.destroySurfaces:6843 com.android.server.wm.ActivityRecord.activityStopped:7510 com.android.server.wm.ActivityClientController.activityStopped:310 android.app.I
问题分析与修复方案
核心问题
- 登录逻辑分支无效:原代码中
else分支永远无法触发,因为if (!validateEmail() | !validatePassword())和else if(validateEmail() && validatePassword())已覆盖所有情况,导致登录成功后的跳转逻辑完全未执行;同时逻辑或应使用||(短路或)而非|(按位或)。 - Firebase数据读取错误:
orderByChild("email")查询返回的节点key并非用户邮箱,直接用snapshot.child(userLoginEmail)会找不到对应节点,导致passwordFromDB为null,引发空指针异常或逻辑混乱。 - 密码验证逻辑颠倒:原代码中密码匹配时提示“无效账户”,不匹配时清除错误,逻辑完全相反。
- 未处理数据库异常:
onCancelled方法未做任何错误处理,无法排查数据库连接问题。
修复后的完整代码
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); loginemail = (EditText) findViewById(R.id.email); loginpassword = (EditText) findViewById(R.id.password); generatorBtn = (Button) findViewById(R.id.idBtnGenerator); RegistrationBtn = (Button) findViewById(R.id.register); generatorBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 短路或优化验证逻辑 if (!validateEmail() || !validatePassword()) { return; } // 验证通过后直接执行用户校验 checkUser(); } }); RegistrationBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(ActivityLogin.this, RegistrationActivity.class); startActivity(i); } }); } public Boolean validateEmail() { String val = loginemail.getText().toString().trim(); if (val.isEmpty()) { loginemail.setError("电子邮箱地址未填写"); return false; } else { loginemail.setError(null); return true; } } public Boolean validatePassword() { String val = loginpassword.getText().toString().trim(); if (val.isEmpty()) { loginpassword.setError("密码未填写"); return false; } else { loginpassword.setError(null); return true; } } public void checkUser() { String userLoginEmail = loginemail.getText().toString().trim(); String userPassword = loginpassword.getText().toString().trim(); DatabaseReference reference = FirebaseDatabase.getInstance().getReference("users"); Query checkUserDatabase = reference.orderByChild("email").equalTo(userLoginEmail); checkUserDatabase.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()) { loginemail.setError(null); // 遍历查询到的子节点(orderByChild返回匹配节点列表) for (DataSnapshot childSnapshot : snapshot.getChildren()) { String passwordFromDB = childSnapshot.child("password").getValue(String.class); if (Objects.equals(passwordFromDB, userPassword)) { // 密码匹配,跳转目标页面 Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_SHORT).show(); Intent i = new Intent(ActivityLogin.this, GeneratorQRcodeActivity.class); startActivity(i); finish(); // 关闭登录页面,避免返回 } else { // 密码不匹配提示 loginpassword.setError("密码错误"); loginpassword.requestFocus(); } } } else { loginemail.setError("用户不存在"); loginemail.requestFocus(); } } @Override public void onCancelled(@NonNull DatabaseError error) { // 添加数据库错误提示 Toast.makeText(getApplicationContext(), "数据库查询失败:" + error.getMessage(), Toast.LENGTH_SHORT).show(); } }); }
额外说明
- 确保Firebase数据库规则已配置为允许读取用户数据(测试阶段可临时设置
read: true,上线后需改为基于用户认证的规则)。 - 建议使用Firebase Authentication进行身份验证,而非自行存储密码,提升账号安全性。
内容的提问来源于stack exchange,提问作者Rina Smil
相关产品推荐
相关产品推荐

