首页 > 解决方案 > 如何使用 `listAll()` 方法获取 Firebase 存储项目的数据?

问题描述

我知道文档显示了如何列出这样的项目:

     listRef.listAll()
    .addOnSuccessListener(new OnSuccessListener<ListResult>() {
        @Override
        public void onSuccess(ListResult listResult) {
            for (StorageReference prefix : listResult.getPrefixes()) {
                // All the prefixes under listRef.
                // You may call listAll() recursively on them.
            }

            for (StorageReference item : listResult.getItems()) {
                // All the items under listRef.
            }
        }
    })

...但是我怎样才能得到我的数据item呢?例如,图像 uri 或元数据。

public class Wallpaper {
private String wallpaperName;
private Uri imageUri;


public Wallpaper(String wallpaperName, Uri imageUri) {
    this.wallpaperName = wallpaperName;
    this.imageUri = imageUri;
}

public Wallpaper() {
}

public String getWallpaperName() {
    return wallpaperName;
}

public void setWallpaperName(String wallpaperName) {
    this.wallpaperName = wallpaperName;
}

public Uri getImageUri() {
    return imageUri;
}

public void setImageUri(Uri imageUri) {
    this.imageUri = imageUri;
}
}





public class ShowWallpapers extends AppCompatActivity {

private RecyclerView recyclerView;
private RecyclerViewAdapter recyclerViewAdapter;

private List<Wallpaper> wallpaperList;
private StorageReference storageReference;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show_wallpapers);

    storageReference = FirebaseStorage.getInstance().getReference("wallpapers");

    recyclerView = findViewById(R.id.recyclerview);
    recyclerView.setHasFixedSize(true);

    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    wallpaperList = new ArrayList<>();


    storageReference.listAll()
            .addOnSuccessListener(new OnSuccessListener<ListResult>() {
                @Override
                public void onSuccess(ListResult listResult) {
                    for (StorageReference item : listResult.getItems()) {
                   // i want to set-up my Wallpaper object here and add it to my list
                  // but how can i do that


                    }
                    recyclerViewAdapter = new RecyclerViewAdapter(ShowWallpapers.this,
                            wallpaperList);
                    recyclerView.setAdapter(recyclerViewAdapter);
                }


            }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {

        }
    });
}
}

我的存储的控制台视图:https ://i.imgur.com/jnjW6Ko.png

标签: androidfirebasefirebase-storage

解决方案


关于如何StorageReference. 您可能还想一般地查看StorageReference文档,因为基本上您在列出引用时想要做的任何事情都应该在那里:)

在这种情况下,一旦您在成功处理程序中listAll(),开始启动任务以getMetadata()从存储引用中获取下载 URL(或元数据,使用和类似方法)。

就像是:

        storageReference.listAll()
                .addOnSuccessListener(new OnSuccessListener<ListResult>() {
                    @Override
                    public void onSuccess(ListResult listResult) {
                        for (StorageReference item : listResult.getItems()) {
                            item.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {
                                    // Do whatever you need here.
                                    Log.w(TAG, "downloadUrl:" + uri.toString());
                                }
                            }).addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception exception) {
                                    // Handle any errors
                                }
                            });
                        }
                    }
                });

当然,上面的内容不会下降到引用位置(通过getPrefixes())的任何前缀,它只是列出了在该引用处直接可用的 blob。


推荐阅读