到目前为止,我对 Firebase
留下了深刻的印象。但我想知道如何自定义用户电子邮件身份验证。我想添加以下字段: 年龄 和 性别 ,供用户在注册时填写。
这是我的SignUpActivity.java。
public class SignUpActivity extends AppCompatActivity {
private EditText inputEmail, inputPassword, signupInputUsername, signupInputAge;
private Button btnLinkLogin, btnSignUp, btnResetPassword;
private ProgressBar progressBar;
private FirebaseAuth auth;
private Spinner sexSpinner;
String defaultTextForSpinner = "Sex";
String[] arrayForSpinner = {"Male", "Female"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signup);
//Get Firebase auth instance
auth = FirebaseAuth.getInstance();
inputEmail = (EditText) findViewById(R.id.signup_input_email);
signupInputUsername = (EditText) findViewById(R.id.signup_input_username);
inputPassword = (EditText) findViewById(R.id.signup_input_password);
signupInputAge = (EditText) findViewById(R.id.signup_input_birthday);
sexSpinner = (Spinner)findViewById(R.id.spinner);
sexSpinner.setAdapter(new CustomSpinnerAdapter(this, R.layout.spinner_row, arrayForSpinner, defaultTextForSpinner));
btnSignUp = (Button) findViewById(R.id.btnSignUp2);
btnLinkLogin = (Button) findViewById(R.id.btnorlogin);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
EditText edittext = (EditText) findViewById(R.id.signup_input_birthday);
edittext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//To show current date in the datepicker
Calendar mcurrentDate = Calendar.getInstance();
int mYear = mcurrentDate.get(Calendar.YEAR);
int mMonth = mcurrentDate.get(Calendar.MONTH);
int mDay = mcurrentDate.get(Calendar.DAY_OF_MONTH);
DatePickerDialog mDatePicker=new DatePickerDialog(SignUpActivity.this, new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) {
// TODO Auto-generated method stub
/* Your code to get date and time */
}
},mYear, mMonth, mDay);
mDatePicker.setTitle("Select birthday");
mDatePicker.show(); }
});
btnSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String email = inputEmail.getText().toString().trim();
String password = inputPassword.getText().toString().trim();
if (TextUtils.isEmpty(email)) {
Toast.makeText(getApplicationContext(), "Enter email address.", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(password)) {
Toast.makeText(getApplicationContext(), "Enter password.", Toast.LENGTH_SHORT).show();
return;
}
if (password.length() < 6) {
Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters.", Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE);
//create user
auth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(SignUpActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Toast.makeText(SignUpActivity.this, "createUserWithEmail:onComplete:" + task.isSuccessful(), Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.GONE);
// 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()) {
Toast.makeText(SignUpActivity.this, "Authentication failed." + task.getException(),
Toast.LENGTH_SHORT).show();
} else {
startActivity(new Intent(SignUpActivity.this, MainActivity.class));
finish();
}
}
});
}
});
}
@Override
protected void onResume() {
super.onResume();
progressBar.setVisibility(View.GONE);
}
public class CustomSpinnerAdapter extends ArrayAdapter<String> {
Context context;
String[] objects;
String firstElement;
boolean isFirstTime;
public CustomSpinnerAdapter(Context context, int textViewResourceId, String[] objects, String defaultText) {
super(context, textViewResourceId, objects);
this.context = context;
this.objects = objects;
this.isFirstTime = true;
setDefaultText(defaultText);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if(isFirstTime) {
objects[0] = firstElement;
isFirstTime = false;
}
return getCustomView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
notifyDataSetChanged();
return getCustomView(position, convertView, parent);
}
public void setDefaultText(String defaultText) {
this.firstElement = objects[0];
objects[0] = defaultText;
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.spinner_row, parent, false);
TextView label = (TextView) row.findViewById(R.id.spinner_text);
label.setText(objects[position]);
return row;
}
}
答案 0 :(得分:2)
当您使用带有用户和密码的Firebase身份验证时,身份验证后可以获得的唯一数据是您从FirebaseUser对象获取的数据。正如您可能看到的,还有一些方法可以帮助您更轻松地获取数据,例如:getEmail()
,getDisplayName()
,getPhotoUrl()
等。
很遗憾,您无法向age
对象添加gender
和FirebaseUser
等其他数据。如果要添加其他数据,则需要为用户创建模型类,然后将其存储在Firebase数据库中。
你的模型类应该是这样的:
public class User {
String name, gender, emailAddress;
int age;
public User(String name, String gender, String emailAddress, int age) {
this.name = name;
this.gender = gender;
this.emailAddress = emailAddress;
this.age = age;
}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getGender() {return gender;}
public void setGender(String gender) {this.gender = gender;}
public String getEmailAddress() {return emailAddress;}
public void setEmailAddress(String emailAddress) {this.emailAddress = emailAddress;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
}
答案 1 :(得分:1)
答案 2 :(得分:1)
抱歉,延迟,但是我一直在寻找如何存储更大的自定义数据-这是不可能的,但是这是我的处理方法。
在displayName(Javascript)内存储少量额外数据。
result.user.updateProfile({
displayName: gender + '|' + sex + '|' + username
})
.then(function () {
console.log(`Profile updated.`);
要检索数据,只需拆分displayName(Node.js):
return admin.auth().getUser(uid)
})
.then(userRecord => {
displayName = userRecord.getDisplayName();
parts = String(user.displayName).split('|');
gender = parts[0];
sex = parts[1];
username = parts[2];
答案 3 :(得分:0)
注册新用户后,您将从 Firebase 收到生成的用户 uuid,这时您需要获取 uuid 并使用您提供的 uuid 在 Firestore 存储库/实时数据库中创建一个新用户条目,并且附加信息。