gpt4 book ai didi

java - 如何让两种不同类型的用户自动登录不同的 Activity 而无需再次登录?

转载 作者:行者123 更新时间:2023-12-02 11:12:25 26 4
gpt4 key购买 nike

我正在使用 Firebase 作为后端构建这个 Android 应用程序。它需要两组不同的用户,一组讲师和一组学生。然而有一个问题。我希望已经登录并关闭应用程序的学生在再次打开应用程序时自动登录到不同的家庭 Activity 。这同样适用于讲师。我该如何实现这一目标?有人可以帮忙提供示例代码吗?我了解 firebase 用于自动将用户登录到应用程序主页的功能,但是如果一个人是学生或讲师,我如何指定应自动打开的页面?

我的登录 Activity

public class LoginActivity extends AppCompatActivity {

private TextInputLayout mLoginEmail;
private TextInputLayout mLoginPassword;

private ProgressDialog mLoginProgress;

private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference jLoginDatabase, student_token_reference, lecturer_token_reference;

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

mLoginProgress = new ProgressDialog(this);

mAuth = FirebaseAuth.getInstance();

if (mAuth.getCurrentUser() != null) {
Intent main_intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(main_intent);
}


mLoginEmail = findViewById(R.id.login_email);
mLoginPassword = findViewById(R.id.login_password);

Button mLogin_btn = findViewById(R.id.login_btn);

TextView msignup = findViewById(R.id.sign_up_text);
msignup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent gotosignup = new Intent(LoginActivity.this, ChoiceActivity.class);
startActivity(gotosignup);
}
});

mLogin_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String email = mLoginEmail.getEditText().getText().toString();
String password = mLoginPassword.getEditText().getText().toString();

if (!TextUtils.isEmpty(email) || !TextUtils.isEmpty(password)) {

mLoginProgress.setTitle("Logging in user");
mLoginProgress.setMessage("Please wait while we log you in...");
mLoginProgress.setCanceledOnTouchOutside(false);
mLoginProgress.show();

loginUser(email, password);

} else {
Toast.makeText(LoginActivity.this, "Please fill in credentials first", Toast.LENGTH_LONG).show();
}


}
});

mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {

} else {
// User is signed out
}
// ...
}
};

}

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

// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (task.isSuccessful()) {

FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
String RegisteredUserID = currentUser.getUid();

jLoginDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(RegisteredUserID);

jLoginDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String userType = dataSnapshot.child("userType").getValue().toString();
if (userType.equals("Lecturers")) {

mLoginProgress.dismiss();

Intent intentResident = new Intent(LoginActivity.this, LecturerMainActivity.class);
intentResident.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intentResident);
finish();

} else if (userType.equals("Students")) {

mLoginProgress.dismiss();

Intent intentMain = new Intent(LoginActivity.this, MainActivity.class);
intentMain.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intentMain);
finish();

} else {

mLoginProgress.hide();
Toast.makeText(LoginActivity.this, "Failed to authenticate user", Toast.LENGTH_SHORT).show();

}
}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});
}
}
});
}


@Override
protected void onStart() {
super.onStart();
}

@Override
protected void onStop() {
super.onStop();
}

@Override
public void onBackPressed() {
moveTaskToBack(true);
super.onBackPressed();
}
}

最佳答案

这是我用来解决同样问题的一个技巧。 (请注意,此方法可能存在安全问题,我更喜欢通过 Firebase 管理使用 Firebase 自定义声明)。

创建一个LoginActivity,使用它登录用户,登录后,在UserTypeSelectorActivity中访问用户类型(管理员、学生、员工、付费用户等)并在此 Activity 中,您可以使用 Intent 数据或共享首选项(根据您的应用程序感觉更好)将用户类型传递给其他 Activity

public class UserTypeSelectorActivity extends AppCompatActivity {

// Firebase Variables
FirebaseUser firebaseUser;
FirebaseDatabase firebaseDatabase;
DatabaseReference firebaseDatabaseReference;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("Activity Name", getLocalClassName());

// Initializing Firebase Variables
firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
firebaseDatabase = FirebaseDatabase.getInstance();
firebaseDatabaseReference = firebaseDatabase.getReference();

if (firebaseUser != null) {
firebaseDatabaseReference.child("my_app_user").child(firebaseUser.getUid())
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

// Check user type and redirect accordingly
if (dataSnapshot.child("admin").exists()) {
Boolean admin = dataSnapshot.child("admin")
.getValue().toString().equals("true");
if (admin) {
startActivity(new Intent(UserTypeSelectorActivity.this,
AdminActivity.class));
finish();
} else {
startActivity(new Intent(UserTypeSelectorActivity.this,
ClientActivity.class));
finish();
}
}
}

@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
}

注意:预防性警告,表明这不是正确的解决方案。这就是我在我的应用程序中实现的方式。

关于java - 如何让两种不同类型的用户自动登录不同的 Activity 而无需再次登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50534695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com