繁体   English   中英

保持用户登录Java Firebase

[英]Keep User logged in Java Firebase

即使他们关闭应用程序后我也试图让用户登录我的聊天应用程序。 因此,如果他们点击退出按钮,他们将从他们的帐户注销的唯一方式。

到目前为止,用户确实保持登录状态,但是当我单击“注销”按钮时,应用程序崩溃了。 这是我得到的错误

 Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference
    at com.example.chatterbox.ChatsFragment.onCreateView(ChatsFragment.java:54)

问题是该错误来自不同的文件。 有人可以帮帮我吗 ?

public class LoginActivity extends AppCompatActivity {

private FirebaseAuth mAuth;
private ProgressDialog loadingBar;

private Button LoginButton ;
private EditText UserEmail, UserPassword;
private TextView NeedNewAccountLink, ForgetPasswordLink;

private DatabaseReference UsersRef;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    RelativeLayout relativeLayout = findViewById(R.id.layout);
    AnimationDrawable animationDrawable = (AnimationDrawable) relativeLayout.getBackground();
    animationDrawable.setEnterFadeDuration(5000);
    animationDrawable.setExitFadeDuration(5000);
    animationDrawable.start();

    mAuth = FirebaseAuth.getInstance();
    UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");

    InitializeFields();

    if (UsersRef != null) {

        Intent intent = new Intent(LoginActivity.this, MainActivity.class);
        startActivity(intent);
        finish();

    }

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

                SendUserToRegisterActivity();

            }
        });


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

                AllowUserToLogin();
            }
        });

    }

    private void AllowUserToLogin () {

        String email = UserEmail.getText().toString();
        String password = UserPassword.getText().toString();

        if (TextUtils.isEmpty(email)) {

            Toast.makeText(this, "Please enter your email", Toast.LENGTH_SHORT).show();
        }

        if (TextUtils.isEmpty(password)) {

            Toast.makeText(this, "Please enter your password", Toast.LENGTH_SHORT).show();
        } else {

            loadingBar.setTitle("Logging In");
            loadingBar.setMessage("Please wait...");
            loadingBar.setCanceledOnTouchOutside(true);
            loadingBar.show();

            mAuth.signInWithEmailAndPassword(email, password)
                    .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {

                            if (task.isSuccessful()) {

                                String currentUserId = mAuth.getCurrentUser().getUid();
                                String deviceToken = FirebaseInstanceId.getInstance().getToken();

                                UsersRef.child(currentUserId).child("device_token")
                                        .setValue(deviceToken)
                                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task) {

                                                if (task.isSuccessful()) {

                                                    SendUserToMainActivity();
                                                    Toast.makeText(LoginActivity.this, "Logged in successfully", Toast.LENGTH_SHORT).show();
                                                    loadingBar.dismiss();

                                                }
                                            }
                                        });
                            } else {

                                String message = task.getException().toString();
                                Toast.makeText(LoginActivity.this, "Error:" + message, Toast.LENGTH_SHORT).show();
                                loadingBar.dismiss();

                            }
                        }
                    });

        }

    }

    private void InitializeFields () {

        LoginButton = (Button) findViewById(R.id.login_button);
        UserEmail = (EditText) findViewById(R.id.login_email);
        UserPassword = (EditText) findViewById(R.id.login_password);
        NeedNewAccountLink = (TextView) findViewById(R.id.need_new_account_link);
        ForgetPasswordLink = (TextView) findViewById(R.id.forget_password_link);
        loadingBar = new ProgressDialog(this);

    }

    private void SendUserToMainActivity () {

        Intent mainIntent = new Intent(LoginActivity.this, MainActivity.class);
        mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(mainIntent);
        finish();
    }
    private void SendUserToRegisterActivity () {

        Intent registerIntent = new Intent(LoginActivity.this, RegisterActivity.class);
        startActivity(registerIntent);
    }

错误行:

    currentUserID = mAuth.getCurrentUser().getUid();

这是我检查用户是否已登录的方式。如果是,我将它们发送到MainActivity。 如果他们不是,他们留在LoginActivity

if (UsersRef != null) {

        Intent intent = new Intent(LoginActivity.this, MainActivity.class);
        startActivity(intent);
        finish();

    }

使用addOnSuccessListener而不是addOnCompleteListener

auth.signInWithEmailAndPassword(mEmail, mPassword)
          .addOnSuccessListener(LoginActivity.this, new OnSuccessListener<AuthResult>(){

                    @Override
                    public void onsuccess(@NonNull AuthResult authResult){
                         //your code goes here
                    }
                 });

你打电话

mAuth = FirebaseAuth.getInstance();
UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");

接着

if (UsersRef != null) {
  //do something
}

这有点奇怪,因为您需要知道当前是否有登录Firebase的有效用户。 这个片段可能很有用:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
// User is signed in
} else {
// No user is signed in
}

但是你要检查变量UsersRef(我猜是数据库参考)是否为空...确实你只是给它一个值!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM