Saya juga mengalami masalah ini saat mengerjakan proyek saya. Saya sangat berharap mereka memberikan metode api akhir. Bagaimanapun, ini adalah cara saya melakukannya: Saat Anda mengupload gambar ke penyimpanan Firebase, buat Objek dan teruskan objek ini ke database Firebase pada saat yang bersamaan. Objek ini berisi URI unduhan gambar.
trailsRef.putFile(file).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Uri downloadUri = taskSnapshot.getDownloadUrl();
DatabaseReference myRef = database.getReference().child("trails").child(trail.getUnique_id()).push();
Image img = new Image(trail.getUnique_id(), downloadUri.toString());
myRef.setValue(img);
}
});
Nanti saat Anda ingin mendownload gambar dari folder, Anda cukup melakukan iterasi melalui file di bawah folder itu. Folder ini memiliki nama yang sama dengan "folder" di penyimpanan Firebase, tetapi Anda dapat menamainya sesuka Anda. Saya menempatkannya di utas terpisah.
@Override
protected List<Image> doInBackground(Trail... params) {
String trialId = params[0].getUnique_id();
mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("trails").child(trialId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
images = new ArrayList<>();
Iterator<DataSnapshot> iter = dataSnapshot.getChildren().iterator();
while (iter.hasNext()) {
Image img = iter.next().getValue(Image.class);
images.add(img);
}
isFinished = true;
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Sekarang saya memiliki daftar objek yang berisi URI untuk setiap gambar, saya dapat melakukan apa pun yang ingin saya lakukan dengannya. Untuk memuatnya ke imageView, saya membuat utas lain.
@Override
protected List<Bitmap> doInBackground(List<Image>... params) {
List<Bitmap> bitmaps = new ArrayList<>();
for (int i = 0; i < params[0].size(); i++) {
try {
URL url = new URL(params[0].get(i).getImgUrl());
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
bitmaps.add(bmp);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmaps;
}
Ini mengembalikan daftar Bitmap, ketika selesai saya cukup melampirkannya ke ImageView di aktivitas utama. Metode di bawah ini adalah @Override karena saya memiliki antarmuka yang dibuat dan mendengarkan penyelesaian di utas lain.
@Override
public void processFinishForBitmap(List<Bitmap> bitmaps) {
List<ImageView> imageViews = new ArrayList<>();
View v;
for (int i = 0; i < bitmaps.size(); i++) {
v = mInflater.inflate(R.layout.gallery_item, mGallery, false);
imageViews.add((ImageView) v.findViewById(R.id.id_index_gallery_item_image));
imageViews.get(i).setImageBitmap(bitmaps.get(i));
mGallery.addView(v);
}
}
Perhatikan bahwa saya harus menunggu List Image dikembalikan terlebih dahulu dan kemudian memanggil utas untuk bekerja pada List Bitmap. Dalam hal ini, Gambar berisi URI.
@Override
public void processFinish(List<Image> results) {
Log.e(TAG, "get back " + results.size());
LoadImageFromUrlTask loadImageFromUrlTask = new LoadImageFromUrlTask();
loadImageFromUrlTask.delegate = this;
loadImageFromUrlTask.execute(results);
}
Semoga seseorang merasa terbantu. Itu juga akan berfungsi sebagai garis serikat untuk diriku sendiri di masa depan juga.