2017-05-19 1 views
4

Ich mache dieses Android-Projekt, in dem ich Hilfe beim Abrufen aller URLs, die in Firebase Storage gespeichert sind, und zeige sie alle in Imageview. Das Problem mit dem angegebenen Code besteht darin, dass nur eine Download-URL abgerufen wird. Auf diese Weise kann ich alle URLs für alle in Firebase gespeicherten Images abrufen. Kurz gesagt: Es gibt eine Aktivität, in der ich die Bilder in Firebase speichern und in anderen möchte ich alle Bilder in Imageview abrufen. In welcher Weise kann ich es tun? DankWie erhalten Sie URLs aller Bilder, die in Firebase in Android gespeichert sind?

if(requestCode== GALLERY_INTENT && resultCode== RESULT_OK) 
    { 
      mProgress.setMessage("Uploading...."); 
      mProgress.show(); 
      Uri uri =data.getData(); 
     StorageReference filepath = mStorage.child("Photos").child(uri.getLastPathSegment()); 
     filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
      @Override 
      public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 

       mProgress.dismiss(); 
       Uri downloadUri = taskSnapshot.getDownloadUrl(); 

       Picasso.with(MainActivity.this).load(downloadUri).fit().centerCrop().into(mImageView); 
       Toast.makeText(MainActivity.this,"Upload done",Toast.LENGTH_LONG).show(); 
      } 
     }).addOnFailureListener(new OnFailureListener() { 
      @Override 
      public void onFailure(@NonNull Exception e) { 
       Toast.makeText(MainActivity.this,"Upload failed",Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 

Antwort

2

Ich glaube nicht, gibt es eine API alle Dateien in Feuerbasis Speicher gespeichert zu holen. Wenn ich Dateien speicherte, speicherte ich die Datei-Metadaten einschließlich des Dateinamens, der Download-URL usw. in der Echtzeit-Datenbank.

Also, wenn ich alle Dateien aus dem Speicher holen musste, würde ich die Datenbank verwenden.

Bearbeiten:

Hier ist, wie ich es gemacht habe.

UploadTask uploadTask = storageRef.putBytes(data,storageMetadata); 
    uploadTask.addOnFailureListener(new OnFailureListener() { 
     @Override 
     public void onFailure(@NonNull Exception exception) { 

     } 
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
     @Override 
     public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
      //Save to database using 
     //taskSnapshot.getMetadata().getCustomMetadata(StringKeys.SOME_KEY); 
     } 
    }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() { 
     @Override 
     public void onProgress(UploadTask.TaskSnapshot taskSnapshot) { 

     } 
    }); 
+0

Können Sie mir empfehlen, einen Weg, das zu tun? – Rohit

0

In Firebase, derzeit gibt es keine API-Aufruf, die Sie Liste aller Dateien in Firebase Speicher geben kann. Stattdessen, was Sie tun können, ist, sobald Bild auf Firebase Storage hochgeladen wird, erhalten Sie den Download-Link dieses Bildes mit getDownloadUrl(); und speichern Sie es in Echtzeit-Datenbank.


Um Daten aus der Datenbank lesen oder zu schreiben, müssen Sie eine Instanz von DatabaseReference:

private DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference(); 

Um einen Link des hochgeladenen Bildes Echtzeit-Datenbank zu speichern, müssen Sie Java-Objekt erstellen, wie zum Beispiel :

public class Image implements Serializable { 
    public String downloadUrl; 

    public Image() { 
    } 

    public Image(String dUrl) { 
     this.downloadUrl = dUrl; 
    } 
} 

Sobald Sie Java-Objekt erstellt, in onSuccess(UploadTask.TaskSnapshot taskSnapshot) folgenden Codezeilen hinzu:

Uri downloadUri = taskSnapshot.getDownloadUrl(); 
Image image = new Image(downloadUri.toString()); 
String userId = databaseReference.push().getKey(); 
databaseReference.child(userId).setValue(image); 

Dies wird Download-Link dieses Bildes in Echtzeit-Datenbank hinzufügen. Wenn Sie nun alle Liste der Bilder in Ihrem Firebase Speicher wollen, einfach den folgenden Code verwenden:

private ArrayList<Data> list; 
... 
private void getImagesList() { 
    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) { 
       Data data = new Data(childSnapshot.child("downloadUrl").getValue().toString()); 
       list.add(data); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 
} 
Verwandte Themen