将图像上传到Firebase Cloud Storage后,我想将其公共下载URL添加到实时数据库中的子节点。
我的文件上传代码
private void uploadFile() {
if (imageUri != null) {
StorageReference fileRef = storageReference.child(UID + "/pic" + ".png");
UploadTask uploadTask = fileRef.putFile(imageUri);
uploadTask.addOnSuccessListener(OrderPickupActivity.this, new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
imageURL = uri.toString();
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(OrderPickupActivity.this, e.toString(), Toast.LENGTH_LONG).show();
}
});
} else {
Toast.makeText(this, "Choose an image!", Toast.LENGTH_SHORT).show();
}
}
上传到实时数据库
uploadFile();
PickupDetails newPickup = new PickupDetails(
date,
time,
name,
email,
address,
pinCode,
UID,
phoneNumber,
imageURL
);
FirebaseDatabase.getInstance().getReference("Pending-Requests")
.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
.setValue(newPickup)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
//Toast.makeText(OrderPickupActivity.this, "Success!", Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
startActivity(new Intent(OrderPickupActivity.this, MainActivity.class));
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(OrderPickupActivity.this, "Error, " + e, Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
}
});
提取详细信息类
public class PickupDetails {
public String date, time, userName, userEmail, userAddress, pinCode, userUID, phoneNumber, image;
public PickupDetails(String date, String time, String userName, String userEmail, String userAddress, String pinCode, String userUID, String phoneNumber, String image) {
this.date = date;
this.time = time;
this.userName = userName;
this.userEmail = userEmail;
this.userAddress = userAddress;
this.pinCode = pinCode;
this.userUID = userUID;
this.phoneNumber = phoneNumber;
this.image = image;
}
}
我在StackOverflow上使用了类似问题的答案,但是似乎没有一个对我有帮助。记录结果时,我可以获取该值,但它无法到达数据库。
答案 0 :(得分:0)
在getDownloadUrl侦听器的onSuccess方法中:
databaseRef.child("images").push().setValue(uri.toString())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(MainActivity.this, "Image uri saved.", Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(MainActivity.this, "Error occured.", Toast.LENGTH_SHORT).show();
}
});
答案 1 :(得分:0)
如Doug所述,firebase API是异步的,这意味着它们将在后台工作,同时让其余逻辑工作。诀窍是在任务完成后 提交到数据库。我要做的就是将添加的内容移到onSuccessListener中的数据库逻辑中。