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

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

问题分析与修复方案

核心问题

  1. 登录逻辑分支无效:原代码中else分支永远无法触发,因为if (!validateEmail() | !validatePassword())和else if(validateEmail() && validatePassword())已覆盖所有情况,导致登录成功后的跳转逻辑完全未执行;同时逻辑或应使用||(短路或)而非|(按位或)。
  2. Firebase数据读取错误:orderByChild("email")查询返回的节点key并非用户邮箱,直接用snapshot.child(userLoginEmail)会找不到对应节点,导致passwordFromDB为null,引发空指针异常或逻辑混乱。
  3. 密码验证逻辑颠倒:原代码中密码匹配时提示“无效账户”,不匹配时清除错误,逻辑完全相反。
  4. 未处理数据库异常: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:15:55