java - 保持用户登录 Java Firebase

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

即使用户关闭应用程序后,我也试图让用户保持登录到我的聊天应用程序。因此,他们退出帐户的唯一方法是单击注销按钮。

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

 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();

    }

最佳答案

你打电话

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

然后

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

这有点奇怪,因为您需要知道当前是否有有效用户登录 Firebase。这个 fragment 也许有用:

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

但是你正在检查变量UsersRef(我猜是一个DatabaseReference)是否为空...实际上你只是给了它一个值!!!

关于java - 保持用户登录 Java Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56201489/

相关文章:

java - 如何使用 Hibernate 根据现有列填充集合

android - 如何在 Android 应用程序中结合 RxJava Single & Completable Retrofit 调用

javascript - 无法为 Firebase 部署 Cloud Functions

java - 当我的类和文本文件位于可执行 JAR 中时,如何编写代码来访问文本文件?

java - 类型参数 T 不在类型变量 T 的范围内(Java 泛型)

java - Maven 编译 UTF-8 和属性文件

android - 从 Corona Enterprise 插件开发开始

Android新项目没有代码,apk是4mb

javascript - 在 javascript 中使用 firebase firestore 更新功能中的 promise

firebase - 从 Firebase 控制台检索注册的 token