我想将用户的详细信息存储到 firebase 数据库中,但我想首先将图像存储到 storageRef 中,然后使用在最终注册之前作为我的个人资料图像链接返回的图像 url。我遇到的问题是,在返回图像 url 之前,还会通过返回 null 作为我的个人资料图像来执行存储完整信息的方法。我正在寻找一种方法,让 registerStudent 方法等到应用程序成功上传图像后才开始执行,以便它可以使用返回的图像 url 作为用户的个人资料图像。这是我尝试过的
private void uploadProfileImage(String regNumber, Uri imageUri, ProgressDialog progressDialog){
if (imageUri !=null){
final StorageReference fileRef = profileImageStorageRef
.child(regNumber+".jpg");
StorageTask uploadTask = fileRef.putFile(imageUri);
uploadTask.continueWithTask(new Continuation() {
@Override
public Object then(@NonNull Task task) throws Exception {
if (!task.isSuccessful()){
progressDialog.dismiss();
throw task.getException();
}
return fileRef.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()){
Uri downloadUri = task.getResult();
myUri = downloadUri.toString();
}
}
});
}
}
private void registerStudent(StudentModel studentModel,ProgressDialog progressDialog){
HashMap hashMap = new HashMap<>();
hashMap.put("name",studentModel.getName());
hashMap.put("regNumber",studentModel.getRegNumber());
hashMap.put("gender",studentModel.getGender());
hashMap.put("testScore",studentModel.getTestScore());
hashMap.put("profileImage",myUri);
hashMap.put("testStatus",studentModel.getTestStatus());
firebaseDatabase.getReference().child("Students")
.child(studentModel.getRegNumber())
.updateChildren(hashMap)
.addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful()){
progressDialog.dismiss();
Toast.makeText(application, "Registration Successful", Toast.LENGTH_SHORT).show();
}else {
progressDialog.dismiss();
Toast.makeText(application, "Error Occurred, Please Try Again", Toast.LENGTH_SHORT).show();
}
}
});
}
public void processStudentRegistration(StudentModel studentModel,Uri imageUri, ProgressDialog progressDialog,Activity activity){
progressDialog.setTitle("Registration Processing....");
progressDialog.setMessage("Please wait while we are checking your credentials");
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
firebaseDatabase.getReference().child("Registration Number")
.child(studentModel.getRegNumber())
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()){
firebaseDatabase.getReference().child("Students").child(studentModel.getRegNumber())
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()){
progressDialog.dismiss();
showMessage("Error","Student with this Registration Number has Already Registered",activity);
}else {
uploadProfileImage(studentModel.getRegNumber(),imageUri,progressDialog);
registerStudent(studentModel,progressDialog);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}else {
progressDialog.dismiss();
showMessage("Error","You are not qualified to Register for this course",activity);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(application, error.toString(), Toast.LENGTH_SHORT).show();
}
});
}
您可以通过确保在
registerStudent
成功完成后运行 registerStudent
来解决此问题。
这是实现它的方法:
创建一个接口/回调来处理图像上传完成:
public interface ImageUploadCallback {
void onImageUploadSuccess(String imageUrl);
void onImageUploadFailure(String errorMessage);
}
然后将
uploadProfileImage
修改为:
private void uploadProfileImage(String regNumber, Uri imageUri, ProgressDialog progressDialog, ImageUploadCallback callback) {
if (imageUri != null) {
final StorageReference fileRef = profileImageStorageRef.child(regNumber + ".jpg");
StorageTask<UploadTask.TaskSnapshot> uploadTask = fileRef.putFile(imageUri);
uploadTask.continueWithTask(task -> {
if (!task.isSuccessful()) {
progressDialog.dismiss();
throw task.getException();
}
return fileRef.getDownloadUrl();
}).addOnCompleteListener(task -> {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult();
if (downloadUri != null) {
String imageUrl = downloadUri.toString();
callback.onImageUploadSuccess(imageUrl); // Image upload success, pass the URL
} else {
callback.onImageUploadFailure("Failed to get image URL");
}
} else {
callback.onImageUploadFailure("Image upload failed");
}
});
}
}
最后修改
processStudentRegistration
使其能够像这样处理回调:
public void processStudentRegistration(StudentModel studentModel, Uri imageUri, ProgressDialog progressDialog, Activity activity) {
// ... (other existing code remains the same)
uploadProfileImage(studentModel.getRegNumber(), imageUri, progressDialog, new ImageUploadCallback() {
@Override
public void onImageUploadSuccess(String imageUrl) {
studentModel.setProfileImage(imageUrl); // Set the image URL in the student model
registerStudent(studentModel, progressDialog);
}
@Override
public void onImageUploadFailure(String errorMessage) {
progressDialog.dismiss();
showMessage("Error", errorMessage, activity);
}
});
}