java - Firebase 数据库没有显示图片
问题描述
因此,当我上传图片时,我正在将图片保存到应用程序中的数据库中。它将它正确地上传到存储和数据库,但是当我重新启动应用程序时它没有显示它。我使用方法filechooser() 选择文件并使用fileuploader() 上传。它工作得很好。
enter code herepublic class ProfilBearbeiten extends AppCompatActivity {
Button bestätigen;
private SharedPreferences speicher;
private SharedPreferences.Editor editor;
TextView fullName,email;
EditText ort,beschreibung, telefonummer, interessen;
FirebaseAuth fAuth;
FirebaseFirestore fStore;
String userId;
ImageView user;
Uri imageurl;
StorageReference mStorageRef;
private StorageTask uploadtask;
private Bitmap compressor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.profilbearbeiten);
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
FirebaseDatabase database = FirebaseDatabase.getInstance();
mStorageRef= FirebaseStorage.getInstance().getReference().child("Images");
DatabaseReference reference = database.getReference();
userId = fAuth.getCurrentUser().getUid();
fullName = findViewById(R.id.tv_name);
email = findViewById(R.id.tvEmail);
bestätigen = findViewById(R.id.btbestätigen);
ort = findViewById(R.id.tv_address);
telefonummer = findViewById(R.id.tvTel);
interessen = findViewById(R.id.tvInt);
beschreibung = findViewById(R.id.tvBesc);
user = findViewById(R.id.User);
user.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
filechooser();
// fileuploader();
Picasso.get().load(imageurl).into(user);
}
});
bestätigen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// get Information from Edit Text or fileuploader()
final String eemail = email.getText().toString().trim();
final String efullname = fullName.getText().toString();
final String eort = ort.getText().toString();
final String einteresssen = interessen.getText().toString();
final String ebeschreibung = beschreibung.getText().toString();
final String etelefonnummer = telefonummer.getText().toString();
final String bild = "";
final String image = imageurl != null ? imageurl.toString() : null;
userId = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("users").document(userId);
//save edited Information in Database
Map<String, Object> user = new HashMap<>();
user.put("Benutername", efullname);
user.put("EMail", eemail);
user.put("Ort", eort);
user.put("Interessen", einteresssen);
user.put("Beschreibung", ebeschreibung);
user.put("Telefonnummer", etelefonnummer);
user.put("Image", image);
documentReference.set(user);
Intent intent = new Intent(ProfilBearbeiten.this, Profile.class);
startActivity(intent);
fileuploader();
}
});
DocumentReference documentReference = fStore.collection("users").document(userId);
documentReference.addSnapshotListener(this, new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
fullName.setText(documentSnapshot.getString("Benutername"));
email.setText(documentSnapshot.getString("EMail"));
ort.setText(documentSnapshot.getString("Ort"));
telefonummer.setText(documentSnapshot.getString("Telefonnummer"));
interessen.setText(documentSnapshot.getString("Interessen"));
beschreibung.setText(documentSnapshot.getString("Beschreibung"));
Picasso.get().load(documentSnapshot.getString("Image")).into(user);
}
});
}
// uploads and open gallery on device
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode== 1 && resultCode==RESULT_OK && data != null && data.getData() != null){
imageurl=data.getData();
user.setImageURI(imageurl);
}
}
private void filechooser(){
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 1);
}
private String getExtension(Uri uri) {
ContentResolver cr = getContentResolver();
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
return mimeTypeMap.getExtensionFromMimeType(cr.getType(uri));
}
private void fileuploader () {
StorageReference Ref = mStorageRef.child(System.currentTimeMillis()+","+getExtension(imageurl));
uploadtask = Ref.putFile(imageurl)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
// Get a URL to the uploaded content
Toast.makeText(ProfilBearbeiten.this, "Image Uploaded", Toast.LENGTH_LONG).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle unsuccessful uploads
// ...
}
});
}
}
如您所见。URL 保存在数据库中的图像下。当我上传图片并切换到其他页面时,当我回到这张幻灯片时,将显示图片。但是每当我关闭应用程序并重新启动它时,即使 URL 仍然以相同的方式在数据库中,图片也会消失。也许我的错误是如何加载它?Picasso.get().load(documentSnapshot.getString("Image")).into(user);
解决方案
您存储在数据库中的 URL 是将其上传到 Cloud Storage 的设备上的图像的本地 URL。它是特定 Android 设备上的本地路径,相机在其中写入文件。
虽然此 URL 最初可以在该特定设备上运行,但以后可能无法运行(因为该文件可能会被 Android 清理),并且肯定不会在其他设备上运行(因为该图像不存在那里)。
要拥有一个随时随地都可以使用的 URL,您需要生成一个所谓的下载 URL,并将该值存储在数据库中。您通常在上传图片后立即执行此操作,并调用getDownloadURL
:
StorageReference Ref = mStorageRef.child(System.currentTimeMillis()+","+getExtension(imageurl));
uploadtask = Ref.putFile(imageurl)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(ProfilBearbeiten.this, "Image Uploaded", Toast.LENGTH_LONG).show();
// Get a URL to the uploaded content
Ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
// Got the download URL, so write it to the database
userId = fAuth.getCurrentUser().getUid();
DocumentReference documentReference = fStore.collection("users").document(userId);
documentReference.update("Image", uri.toString());
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle unsuccessful uploads
// ...
}
});
另请参阅有关上传文件的文档,其中还显示了如何防止嵌套任务失败处理程序。
推荐阅读
- javascript - javascript中是否有任何方法可以为一个HTML元素单独操作一个函数?
- python - Dash/Plotly Express Arguments to update_layout() 的文档
- routes - 有什么方法可以在 Here Routing Service 中发送有关路由的反馈?
- javascript - 从json转换时如何强制用双引号将csv文件的所有值括起来?
- javascript - Javascript 使用 filter() 删除嵌套数组元素
- javascript - 使用 Javascript 显示来自 XML API 的特定信息
- mongodb - Kmongo:如何添加唯一字段
- c# - Microsoft.Graph.ServiceException:'代码:BadRequest 消息:此通道不支持操作
- html - VueJS:当对象的属性是可变的时,我将如何遍历对象数组
- snowflake-cloud-data-platform - 使用自定义 UDF 转换表并将结果保存在雪花中