我的应用程序必须下载将在Firebase Storage上上传的所有声音。为此,我采用了以下方法:
1)Firebase Storage中的所有声音都应命名为1到n(1.mp3、2.mp3、3.mp3 ... n.mp3)。 enter image description here
2)之后,它将创建临时文件的ArrayList。 Firebase Storage的声音将直接上传到其中。
private int howmuch = 4;
ArrayList<File> music = new ArrayList<File>();
ArrayList<StorageReference> url = new ArrayList<StorageReference>();
try {
for(int i=1; i <= howmuch; i++){
music.add(File.createTempFile("qqqq"+i, "mp3"));}
} catch (IOException e) {
e.printStackTrace();
}
for(int j=1; j <= howmuch; j++){
url.add(FirebaseStorage.getInstance().getReferenceFromUrl("gs://engapp-c0f2e.appspot.com/beginner/"+j+".mp3"));
}
for (int i = 0; i < howmuch; i++){
url.get(i).getFile(music.get(i)).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
// Successfully downloaded data to local file
// ...
Log.d(TAG, "Successfully");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle failed download
// ...
Log.w(TAG, "Failure");
}
});
变量多少返回一个正整数,这是需要精确下载的大量声音,并且需要创建许多临时文件。显然,它们的数量必须相等。可能是4、10、100。
ArrayList 音乐包含临时文件,用于存放声音。 IDE让我将其包装起来以尝试/捕捉。
ArrayList URL 包含指向每个需要下载的文件的链接。如您所见,我为此使用了 for 循环(这看起来很奇怪,但是我真的不知道更好的解决方案)。
因此,尽管该算法似乎很弱,它仍然可以正常工作。它会下载所有声音,我可以使用MediaPlayer播放它。我就是这样的:
try {
mp.setDataSource(File.separator + DBcontent.getMusic(counter));
mp.prepare();
mp.start();
counter ++;
} catch (IOException e) {
e.printStackTrace();
}
DBcontent 是一个类的对象,我们将声音放入Firebase Storage的临时文件中。方法 getMusic()是典型的getter
计数器是典型的计数器。从计数器 = 0开始。因此,我们将从ArrayList中检索所有声音并使其播放。
public File getMusic(int a){
File c = music.get(a);
return c;
}
现在是主要问题。如果Firebase存储中包含的声音少于我们需要下载的声音(例如,多少 = 10,但是存储中只有5种声音),它将可以正常工作,但是临时文件将为空,因此可以不玩。这意味着,如果多少为10,而计数器为6,则该应用将无法正常运行。
我到底需要什么。或者是检查临时文件ArrayList是否为EMPTY / null并随后将其删除的算法,或者是下载声音并将其放入ArrayList(甚至是sipmlest Array [])的任何其他解决方案。
谢谢。