我有两个不同类型的用户一个为教师和第二普通用户的应用。如果一个正常的成员登录,他会去normal_memberActivity
,如果他是一个教师成员,他会去Teacher_memberActivity
。我如何在loginActivity中做到这一点?如何在Firebase Android应用程序中分隔两个不同的用户?
我的火力地堡结构:
这是数据库火力规则
{
"rules": {
".read": true,
".write":true}
}
我有两个不同类型的用户一个为教师和第二普通用户的应用。如果一个正常的成员登录,他会去normal_memberActivity
,如果他是一个教师成员,他会去Teacher_memberActivity
。我如何在loginActivity中做到这一点?如何在Firebase Android应用程序中分隔两个不同的用户?
我的火力地堡结构:
这是数据库火力规则
{
"rules": {
".read": true,
".write":true}
}
我已经解决这个问题了一个星期。我很抱歉地说上面提出的解决方案有点误导。因此,我有一个更好的解决方案,它的101%可行!
首先,这是我在火力地堡实时数据库: I created a child "type" for each type of users created. 然后,我设置卖家帐户为1和买方的帐户2“类型”孩子的价值里面。
其次,当我成功验证的登录信息。在那个特定的时刻,我用的火力实时datasnapshot基于当前用户的UID拉动型的值,然后我验证是否是值等于1或2。最后我能够启动基于活动用户的类型。在计费代码
private void registerUser() {
progressDialog = new ProgressDialog(this);
String email = editTextEmail.getText().toString().trim();
String password = editTextPassword.getText().toString().trim();
if (TextUtils.isEmpty(email)) {
Toast.makeText(this, "Please Enter Emailsss", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(password)) {
Toast.makeText(this, "Please Enter Your PASSWORDS", Toast.LENGTH_SHORT).show();
return;
}
progressDialog.setMessage("Registering User Statement..");
progressDialog.show();
//Firebase authentication (account save)
firebaseAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
//user already logged in
//start the activity
finish();
onAuthSuccess(task.getResult().getUser());
// startActivity(new Intent(getApplicationContext(), MainActivity.class));
} else {
Toast.makeText(signupActivity.this, "Could not registered , bullcraps", Toast.LENGTH_SHORT).show();
}
progressDialog.dismiss();
}
});
}
private void onAuthSuccess(FirebaseUser user) {
//String username = usernameFromEmail(user.getEmail());
// Write new user
writeNewUser(user.getUid(), toggle_val, user.getEmail());
// Go to MainActivity
startActivity(new Intent(signupActivity.this, MainActivity.class));
finish();
}
private void writeNewUser(String userId, int type, String email) {
User user = new User(Integer.toString(type), email);
if (type == 1){
mDatabase.child("users").child(userId).setValue(user);
}
else {
mDatabase.child("users").child(userId).setValue(user);
}
}
if (toggleBut.isChecked()){
toggle_val = 2;
//Toast.makeText(signupActivity.this, "You're Buyer", Toast.LENGTH_SHORT).show();
}
else{
toggle_val = 1;
//Toast.makeText(signupActivity.this, "You're Seller", Toast.LENGTH_SHORT).show();
}
登录:
帐号创建的代码
private void userLogin() {
String email = editTextEmail.getText().toString().trim();
String password = editTextPassword.getText().toString().trim();
if(TextUtils.isEmpty(email)){
Toast.makeText(this, "Please Enter Emailsss", Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(password)){
Toast.makeText(this, "Please Enter Your PASSWORDS", Toast.LENGTH_SHORT).show();
return;
}
progressDialog.setMessage("Login....");
progressDialog.show();
firebaseAuth.signInWithEmailAndPassword(email,password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
progressDialog.dismiss();
if(task.isSuccessful()){
onAuthSuccess(task.getResult().getUser());
//Toast.makeText(signinActivity.this, "Successfully Signed In", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(signinActivity.this, "Could not login, password or email wrong , bullcraps", Toast.LENGTH_SHORT).show();
}
}
});
}
private void onAuthSuccess(FirebaseUser user) {
//String username = usernameFromEmail(user.getEmail())
if (user != null) {
//Toast.makeText(signinActivity.this, user.getUid(), Toast.LENGTH_SHORT).show();
ref = FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid()).child("type");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = dataSnapshot.getValue(String.class);
//for(DataSnapshot snapshot : dataSnapshot.getChildren()){
// Toast.makeText(signinActivity.this, value, Toast.LENGTH_SHORT).show();
if(Integer.parseInt(value) == 1) {
//String jason = (String) snapshot.getValue();
//Toast.makeText(signinActivity.this, jason, Toast.LENGTH_SHORT).show();
startActivity(new Intent(signinActivity.this, MainActivity.class));
Toast.makeText(signinActivity.this, "You're Logged in as Seller", Toast.LENGTH_SHORT).show();
finish();
} else {
startActivity(new Intent(signinActivity.this, BuyerActivity.class));
Toast.makeText(signinActivity.this, "You're Logged in as Buyer", Toast.LENGTH_SHORT).show();
finish();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
我建议你有这种结构的数据库
users
---details...
---type
密钥类型现在将包含您的用户是否正常或老师。 现在使用FirebaseAuthentication,我想你已经集成在您的应用程序,你可以使用:
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
获取当前登录的用户。有了这一点,你现在可以使用:
String uid = user.getUid();
为了获得用户,我认为你已经使用的为您的用户密钥的当前登录用户的UID。
现在有UID准备好了,你可以使用一个火力地堡查询来获取特定用户的类型和去根据自己的类型的具体活动。
Query userQuery = FirebaseDatabase.getInstance().getReference()
.child("users").orderByKey().equalTo(uid);
userQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String type = dataSnapshot.child("type").getValue().toString();
if(type.equals("Teacher"){
//Go to TeacherMemberActivity
} else {
//Go to NormalMemberActivity
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
可以验证用户通过安装FirebaseAuth.AuthStateListener
内部的事件侦听器和将用户重定向到适当的活动如下
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference ref;
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
ref = FirebaseDatabase.getInstance().getReference().child("hire-teachers").child("teachers");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
if(FirebaseAuth.getInstance().getCurrentUser().getUid().equals(snapshot.getKey())){
startActivity(new Intent(SignInActivity.this, Teacher_memberActivity.class));
}
}
startActivity(new Intent(SignInActivity.this, Normal_memberActivity.class));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
} else {
// User is signed out
}
// ...
}
};
在上述实施属于哪个组(教师或用户) Firebase API,我正在检查用户是否是老师。如果为true,则启动Teacher_memberActivity,如果不是,则启动Normal_memberActivity。
这是新代码:
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference ref;
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
ref = FirebaseDatabase.getInstance().getReference().child("hire-teachers").child("teachers");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Boolean boolean = false;
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
if(FirebaseAuth.getInstance().getCurrentUser().getUid().equals(snapshot.getKey())){
boolean = true;
}
}
if(boolean){
startActivity(new Intent(SignInActivity.this, Teacher_memberActivity.class));
}else{
startActivity(new Intent(SignInActivity.this, Normal_memberActivity.class));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
} else {
// User is signed out
}
// ...
}
};
感谢您的帮助,我有一个问题,这个代码 当我登录为老师没去Teacher_memberActivity他跳到了Normal_memberActivity。为什么? – Asmahan
好的,我认为问题应该与我们指向的数据库节点有关。从你的数据库的角度来看,我认为“聘请教师”节点是根引用的直接子节点。请修改'ref = FirebaseDatabase.getInstance()。getReference()。child(“hire-teachers”)。child(“teachers”)这行。 '以便它完全根据数据库中的数据指向数据库中的节点。 –
我问过firebase的支持,他们告诉我这是可能的,因为“在第一次startActivity之后,你的应用程序将立即执行if子句下面的下一个startActivity,在每次startActivity调用之后尝试添加finish()和return语句,以便调用activity将在应用程序执行完startActivity后结束。“ – Asmahan