Firebase数据库条目仅在Android Studio中设置断点时创建

时间:2017-10-29 07:00:38

标签: java android firebase-realtime-database firebase-authentication

我有以下无法正常运行的SignUp活动:在用户收到验证电子邮件并尝试登录后,应用程序因NullPointerException崩溃,因为未创建Firebase实时数据库中的新用户条目。但是,我注意到,在调试期间,如果我在定义generateUser()的位置设置断点,则会创建一个新的数据库条目(但应用程序崩溃的方式相同)。

这里有什么解决方案?

任何帮助都将受到高度赞赏。

更新:这里强调的不是NullPointerException,我可以处理。问题是为什么generateUser()没有被调用。

public class SignUpActivity extends AppCompatActivity {

    private EditText inputUsername, inputEmail, inputPassword;
    private Button btnSignIn, btnSignUp;
    private ProgressBar progressBar;
    private FirebaseAuth auth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        auth = FirebaseAuth.getInstance();
        FirebaseUser user = auth.getCurrentUser();

        if (user != null) {
            if (user.isEmailVerified()) {
                startActivity(new Intent(SignUpActivity.this, MainActivity.class));
                finish();
            }
        }

        setContentView(R.layout.activity_sign_up);

        btnSignIn = findViewById(R.id.sign_in_button);
        btnSignUp = findViewById(R.id.sign_up_button);
        inputUsername = findViewById(R.id.username);
        inputEmail = findViewById(R.id.email);
        inputPassword = findViewById(R.id.password);
        progressBar = findViewById(R.id.progressBar);

        btnSignIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(SignUpActivity.this, SignInActivity.class));
            }
        });

        btnSignUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final String username = inputUsername.getText().toString().trim();
                final String email = inputEmail.getText().toString().trim();
                final String password = inputPassword.getText().toString().trim();

                if (TextUtils.isEmpty(username)) {
                    Toast.makeText(getApplicationContext(), "Enter username!", Toast.LENGTH_SHORT).show();
                    return;
                }

                if (TextUtils.isEmpty(email)) {
                    Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show();
                    return;
                }

                if (TextUtils.isEmpty(password)) {
                    Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show();
                    return;
                }

                if (password.length() < 6) {
                    Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters!", Toast.LENGTH_SHORT).show();
                    return;
                }

                progressBar.setVisibility(View.VISIBLE);

                auth.createUserWithEmailAndPassword(email, password)
                        .addOnCompleteListener(SignUpActivity.this, new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                progressBar.setVisibility(View.GONE);
                                if (!task.isSuccessful()) {
                                    Toast.makeText(SignUpActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
                                } else {
                                    new GenerateUserAsyncTask().execute(username, email, password, 0);
                                }
                            }
                        });
            }

            class GenerateUserAsyncTask extends AsyncTask<Object, Void, Void> {

                @Override
                protected Void doInBackground(Object... params) {
                    String username = (String) params[0];
                    String email = (String) params[1];
                    String password = (String) params[2];
                    int score = (int) params[3];
                    generateUser(username, email, password, score);
                    return null;
                }

                @Override
                protected void onPostExecute(Void result) {
                    sendVerificationEmail();
                }}
        });

    }

    public void sendVerificationEmail() {
        FirebaseUser user = auth.getCurrentUser();

        if (user != null) {
            user.sendEmailVerification()
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                Toast.makeText(SignUpActivity.this, "Signup successful, verification email sent", Toast.LENGTH_SHORT).show();
                                auth.signOut();
                                startActivity(new Intent(SignUpActivity.this, SignInActivity.class));
                                finish();
                            } else {
                                Toast.makeText(SignUpActivity.this, "Failed to send email!", Toast.LENGTH_SHORT).show();
                            }
                            progressBar.setVisibility(View.GONE);
                        }
                    });
        }

    }

    public void generateUser(String username, String email, String password, int score) {
        FirebaseDatabase database = Utils.getDatabase();
        DatabaseReference users = database.getReference("users");
        User user = new User(username, email, password, score);
        users.child(auth.getUid()).setValue(user);
    }
}

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。该问题是由实时数据库安全规则引起的:它们仅允许用户在经过身份验证时写入数据库。但是,在我的代码中,调用generateUser()时,用户尚未完全通过身份验证。所以我需要在用户点击验证邮件中的链接后在数据库中生成新条目。