从Firebase Storage下载音频阵列

时间:2019-01-24 19:01:32

标签: java android firebase google-cloud-firestore

我的应用程序必须下载将在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 [])的任何其他解决方案。

谢谢。

0 个答案:

没有答案