从Firebase Storage获取随机图像

时间:2018-05-07 10:13:51

标签: java android firebase firebase-realtime-database firebase-storage

我正在为一个基本上是旅行助手的学校项目制作应用程序。用户可以在主页上看到随机国家/地区卡片,这样他就可以点击并获取有关该国家/地区的更多信息。

我的所有国家/地区卡片图片都存储在名为" countryCardImages "的目录中的Firebase Storage中。所有图像都具有它们所代表的国家/地区的名称,因此我无法使用getName(元数据功能)检索该名称。 问题是,如果我将所有照片从1重命名为n,我可以简单地生成一个随机数并将其连接到链接,因此每次打开MainActivity时,它都会生成不同的数字并显示不同的图像。这种方法的问题是,我无法检索国家/地区名称,因为没有地方可以保存该值。所以,我唯一的选择是用他们的国家名称命名图像。是否有另一种方法可以使用这种方法显示随机图像?

数据库结构: enter image description here

1 个答案:

答案 0 :(得分:1)

是的。您可以将所有图片网址存储在Firebase实时数据库中,当您想要检索特定数量的随机图片时,请使用此 post 中的答案。

假设您有一个Firebase数据库,如下所示:

Firebase-root
   |
   --- imageUrls
          |
          --- HollandImageUrl: true
          |
          --- SpainImageUrl: true
          |
          --- FranceImageUrl: true
          |
          --- //Other Countries

要获得5个随机网址,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference imageUrlsRef = rootRef.child("imageUrls");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> urlList = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String url = ds.getKey();
            urlList.add(url);
        }

        int urlCount = urlList.size();
        int randomNumber = new Random().nextInt(urlCount);
        List<String> randomUrlList = new ArrayList<>();
        for (int i=1; i<=5; i++) {
            randomUrlList.add(urlList.get(randomNumber));
            //Set image to ImageView
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
imageUrlsRef.addListenerForSingleValueEvent(valueEventListener);

根据您的评论和数据库结构,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference countriesRef = rootRef.child("countries");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> urlList = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String url = ds.child("Image").getValue(String.class);
            urlList.add(url);
        }

        int urlCount = urlList.size();
        int randomNumber = new Random().nextInt(urlCount);
        List<String> randomUrlList = new ArrayList<>();
        for (int i=1; i<=5; i++) {
            randomUrlList.add(urlList.get(randomNumber));
            //Set image to ImageView
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
countriesRef .addListenerForSingleValueEvent(valueEventListener);