我有兩個不同類型的用戶一個爲教師和第二普通用戶的應用。如果一個正常的成員登錄,他會去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