Firebase Storage下载多张照片 [英] Firebase Storage download multiple photos Urls

查看:99
本文介绍了Firebase Storage下载多张照片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Firebase存储,其中包含照片. 我正在组织名称为1,2,3的照片,依此类推. 我正在尝试获取所有照片的URL,因此将来我会将它们输入URLS的Arraylist中,并使用Glide将其呈现在照片库中(这就是为什么我只在寻找URL)

I have a Firebase storage which contains photos. I'm organizing the photos by name 1,2,3 and so on.... I'm trying to get all the photos dowload URLs , so in the future i will enter them into Arraylist of URLS and present them in a photo gallery using Glide ( that's why i'm only looking for the URLS )

我正在寻找一种方法,仅当调用onSucsess时才继续向我发送Urls,当调用onFailure时(因为没有更多照片了),我希望循环结束.

I'm looking for a method that will keep giving me the Urls only if the onSucsess is called, when onFailure is called (becuase there are no more photos) i want the loop to end.

我正在尝试使用Firebase的getDownloadUrl方法,并添加了一个布尔值,该布尔值将在调用onFailure时触发false. 并增加从1开始的photoOrder int,这样将更改所选照片的​​路径.

I'm was trying using the Firebase's getDownloadUrl method and added a boolean which will trigger false when onFailure is called. And increment my photoOrder int which starts at 1,and by that will change the path of the selected photo.

public class Photopackges extends AppCompatActivity {

public static boolean shouldRun = true;
public static final String TAG = "debug";
public static int photoOrder = 1;

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

    //just normal firebase setup
    FirebaseStorage storage = FirebaseStorage.getInstance();


     // while shouldRun boolean is true keep going , until it will be defined false
    while (shouldRun == true) {

          // define my Firebase storage path,which contain one folder called "test" and three photos 1.jpg,2.jpg,3.jpg
         // the number of the photo is represented in the photoOrder int.
        String storagePath = "test/" + String.valueOf(photoOrder) + ".jpg";
        StorageReference ref = storage.getReference().child(storagePath);

        try {

            ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {

                    // trying to define that if the action was successful , keep on going.
                    shouldRun = true;
                    Log.e(TAG, "sucsess! " + uri);


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

                    // trying to define that if the action has failed , stop.
                    shouldRun = false;
                    Log.e(TAG, "Fail! " + e);
                }
            });


        } catch (Exception e) {
            Log.e(TAG, "Error! " + e);
            break;


        }

        //increment the photoOrder so it will go to the next path.
        photoOrder++;
        Log.e(TAG,"value of photoOrder "+photoOrder);
    }
}
}

日志-

日志信息

我没有问题,他在得到答案之前会发送更多请求. 我只需要他停下来就停下来

I don't have a problem that he sends more requests before he got the answers. I just need him to stop when it gets

StorageException:该位置不存在对象.

StorageException: Object does not exist at location.

我猜想必须有一种更简单的方法来使用Firebase获取所有存储.

I was guessing that there must be a simpler way to get all the storage using firebase..

感谢您的帮助!

推荐答案

好,因此在尝试了很多之后,我能够使用wait()和notify()方法做到这一点.

现在,我可以在我的FirebaseStorage中获取包含所有照片的下载URL ArrayList ,其中可能包含未知数量的照片. 注意,这仅是因为我必须先重命名它们,然后才能将它们输入为(1,2,3 ... etc).

Now i can get ArrayList with all the download URLS of the photos in my FirebaseStorage, which can contain unknown number of photos. notice that's only because i had to rename them before i entered them into my storge as (1,2,3...etc).

要执行此操作,您需要:

  1. 设置FirebaseStorage.
  1. Set up a FirebaseStorage.
  1. 创建一个文件夹(我的称为test)并填充图像.

我能够得到这个Logcat,这是我想要的 请参阅日志

i was able to get this Logcat,which is what i wanted See Log

public static final String TAG = "eyaldebug";
public static PathGenerator pathGenerator;
public static ArrayList<String>photoURLs;

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

    //Initialize the whole process

    photoURLs = new ArrayList<>();

    pathGenerator = new PathGenerator();

    new UrlProducer(pathGenerator);


}


/**
 * This class contains the GeneratePaths method,which responsible
 * of making new paths.
 * Also we have a simple set - get methods of the booleans.
 */

class PathGenerator {
    //start photo number
    int photoNumber = 0;
    //boolean that indicates if the path has been used already or not.
    boolean pathIsTaken = false;
    //our storage path.
    String path;

    /**
     * This method will generate a new path.
     * while path is taken , wait because we didn't use it yet.
     *
     * @param photoNumber
     */

    public synchronized String generatePath(int photoNumber) {

        while (pathIsTaken)
        {
            try {wait();} catch (Exception e) {}
        }
        this.photoNumber = photoNumber;
        path = "test/" + String.valueOf(photoNumber) + ".jpg";
        pathIsTaken = true;
        Log.e("eyaldebug", "path is :  " + path);
        return path;
    }

    /**
     * Simple set method.
     * @param value
     */

    public synchronized void setPathisSet(boolean value)
    {
        this.pathIsTaken = value;
    }

    /**
     * Unfreeze the thread, we call this method after onSucsess.
     */

    public synchronized void unfreeze( )
    {
        notifyAll();
    }

}


/**
 * Our URLProducer calls will take the paths,and will
 * send HTTP request to the storage that we'll get a
 * download URL returned.
 * later we'll be using Glide\Picasso to display those images.
 */

class UrlProducer implements Runnable {

    PathGenerator mPathGenerator;

    //initialize a String type ArrayList which will contain our URLS.
    public  ArrayList<String>photoURLs = new ArrayList<>();

    //constructor that will be called in the activity
    public UrlProducer(PathGenerator mPathGenerator) {
        this.mPathGenerator = mPathGenerator;

        Thread b = new Thread(this, "UrlProducer");
        b.start();
    }

    /**
     * Here we a simple download URL method using FirebaseStorage.
     * for the documentation for FirebaseStoarge download go to :
     *
     * https://firebase.google.com/docs/storage/android/download-files
     *
     * IF the task was successful we UNfreeze the threads so it will
     * keep sending us new URLS.
     * IF the onFailure was called the stroage is must likely empty and
     * we should stop trying to get new photos.
     */

    @Override
    public void run() {


        int photoNumber =0 ;

        while (true) {


            photoNumber ++;

            try {
                FirebaseStorage storage = FirebaseStorage.getInstance();
                StorageReference ref = storage.getReference();


                ref.child(pathGenerator.generatePath(photoNumber)).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {

                        Log.e(TAG, "Success! " + uri);

                        //add the URL into the ArrayList
                        photoURLs.add(String.valueOf(uri));

                       //tell the generate method that the path has been used.
                        pathGenerator.setPathisSet(false);

                        //Unfreeze the thread so it will continue generate new paths.
                        pathGenerator.unfreeze();

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

                        //When onFailure is called shutdown,and output the given ArrayList.

                        Log.e(TAG,"onFailure was called , storage is empty!");
                        Log.e(TAG,"----------------------------------------");
                        for(String singleUrl :photoURLs)
                        {
                            Log.e(TAG,""+singleUrl)   ;
                        }
                    }
                });


            }catch (Exception e){e.printStackTrace();}


        }
    }

}

这篇关于Firebase Storage下载多张照片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆