gpt4 book ai didi

android - Firebase Storage 下载多张照片 Urls

转载 作者:行者123 更新时间:2023-11-29 15:39:48 26 4
gpt4 key购买 nike

我有一个包含照片的 Firebase 存储。我正在按名称 1、2、3 等组织照片......我正在尝试获取所有照片的下载 URL,所以将来我会将它们输入到 URL 的数组列表中,并使用 Glide 将它们呈现在照片库中(这就是为什么我只寻找 URL 的原因)

我正在寻找一种方法,只有在调用 onSuccess 时才会继续给我 Urls,当调用 onFailure 时(因为没有更多照片)我希望循环结束。

我正在尝试使用 Firebase 的 getDownloadUrl 方法并添加了一个 bool 值,它会在调用 onFailure 时触发 false。并增加从 1 开始的 photoOrder int,这将改变所选照片的​​路径。

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

日志 -

Loginfo

我不介意他在得到答案之前发送更多请求。我只需要他停下来就可以了

StorageException: Object does not exist at location.

我猜想一定有更简单的方法来使用 firebase 获取所有存储空间..

感谢您的帮助!

最佳答案

好的,经过大量尝试,我使用 wait() 和 notify() 方法成功了。

现在我可以获取 ArrayList,其中包含我的 FirebaseStorage 中照片的所有下载 URLS,其中可能包含未知数量的照片。请注意,这只是因为在将它们输入我的存储之前我必须将它们重命名为 (1,2,3...etc)。

要实现此功能,您需要:

  1. 设置 FirebaseStorage。
    1. 创建一个文件夹(我的文件夹叫做 test)并填充图像。

我能够得到这个 Logcat,这正是我想要的 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();}


}
}

}

关于android - Firebase Storage 下载多张照片 Urls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42585934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com