Одноразовый вход в приложение - FirebaseAuth
Я работаю над приложением, которое использует аутентификацию Firebase для входа пользователей по номеру телефона. Я хочу добавить функциональность, позволяющую пользователю входить в систему только один раз, т. Е. Даже если пользователь завершает работу приложения и запускает его снова, он должен войти в систему. Кроме того, я не хочу добавлять функцию выхода из системы. Что можно для этого сделать?
Переведено автоматически
Ответ 1
Самый простой способ добиться этого - использовать прослушиватель. Предположим, у вас есть два действия, LoginActivity
и MainActivity
. Прослушиватель, который может быть создан в LoginActivity
, должен выглядеть следующим образом:
FirebaseAuth.AuthStateListener authStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
if (firebaseUser != null) {
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
}
};
По сути, это означает, что если пользователь вошел в систему, пропустите LoginActivity
и перейдите к MainActivity
.
Создание экземпляра FirebaseAuth
объекта:
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
И начните прослушивать изменения в вашем onStart()
методе следующим образом:
@Override
protected void onStart() {
super.onStart();
firebaseAuth.addAuthStateListener(authStateListener);
}
В MainActivity
вы должны сделать то же самое:
FirebaseAuth.AuthStateListener authStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
if (firebaseUser == null) {
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivity(intent);
}
}
};
Что в основном означает, что если пользователь не вошел в систему, пропустите MainActivity
и перейдите к LoginActivity
. В этом упражнении вы должны сделать то же самое, что и в LoginActivity
, вы должны начать прослушивать изменения в onStart()
.
В обоих действиях не забудьте удалить прослушиватель в тот момент, когда он больше не нужен. Поэтому добавьте следующую строку кода в свой onStop()
метод:
@Override
protected void onStop() {
super.onStop();
firebaseAuth.removeAuthStateListener(authStateListener);
}
Ответ 2
Вы можете сохранить сеанс входа пользователя в систему в общих настройках
Сделайте это, когда ваш вход в систему будет успешным
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", Activity.MODE_PRIVATE);
Editor editor = pref.edit();
editor.putBoolean("key_name", true); // Storing boolean - true/false
editor.commit();
и когда ваши приложения запускаются (например, Splash или страница входа), используйте это
SharedPreferences sp=this.getSharedPreferences("MyPref", Context.MODE_PRIVATE);
boolean b = sp.getBoolean("key_name", false);
if(b==true){
//User Already Logged in skip login page and continue to next process
}else{
//User is Not logged in, show login Form
}
Это будет работать на вас.
Ответ 3
Это из моего рабочего кода из класса logging:
private void LoginUserAccount(String email, String password)
{
if (TextUtils.isEmpty(email))
{
Toast.makeText(ResponseStartPage.this, "Please write Your Email", Toast.LENGTH_SHORT).show();
}
if (TextUtils.isEmpty(password))
{
Toast.makeText(ResponseStartPage.this, "Please write Your password", Toast.LENGTH_SHORT).show();
}
else
{
loadingBar.setTitle("Login Account");
loadingBar.setMessage("Please wait for verification...");
loadingBar.show();
mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task)
{
if (task.isSuccessful())
{
String online_user_id = mAuth.getCurrentUser().getUid();
String DeviceToken = FirebaseInstanceId.getInstance().getToken();
usersReference.child(online_user_id).child("device_token").setValue(DeviceToken)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid)
{
Intent mainIntent = new Intent(ResponseStartPage.this, ResponseMainActivity.class);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(mainIntent);
finish();
}
});
}
else
{
Toast.makeText(ResponseStartPage.this, "Please Check your email and password", Toast.LENGTH_SHORT).show();
}
loadingBar.dismiss();
}
});
}
}