Получить случайное изображение из Firebase Storage - PullRequest
0 голосов
/ 07 мая 2018

Я делаю приложение для школьного проекта, который в основном является помощником по путешествиям. Пользователь может видеть случайные карты стран на домашней странице, чтобы он мог щелкнуть и получить дополнительную информацию об этой стране.

Все изображения моей страны хранятся в Firebase Storage в каталоге с именем " countryCardImages ". Все изображения имеют название страны, которую они представляют, поэтому я не могу получить это имя, используя getName (функция метаданных). Дело в том, что если бы я переименовал все фотографии с 1 на n, я мог бы просто сгенерировать случайное число и объединить его со ссылкой, чтобы каждый раз, когда я открывал MainActivity, он генерировал разные числа и показывал разные изображения. Проблема с этим методом заключается в том, что я не могу получить название страны, потому что нет места, где хранится это значение. Таким образом, мой единственный вариант - присвоить изображениям название страны. Есть ли другой способ отображения случайных изображений с помощью этого «метода»?

Структура базы данных: enter image description here

1 Ответ

0 голосов
/ 07 мая 2018

Да, это так. Вы можете хранить все URL-адреса изображений в базе данных Firebase Realtime, и когда вы хотите получить определенное количество случайных изображений, используйте мой ответ из этой записи .

Предполагая, что у вас есть база данных Firebase, которая выглядит следующим образом:

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

Чтобы получить 5 случайных URL, используйте следующий код:

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);
...