0

我想播放列表中的长音频文件,文件在第一次点击时下载,所有接下来的点击播放音频。但问题是,当播放一个文件并点击另一个文件时,第一个文件仍在播放,下一个文件也在播放。当我点击任何列表项时,有没有办法停止所有当前正在播放的文件?

 onPressHandler = (file, title) => {
    let name = file.substring(file.lastIndexOf("/") + 1);

    RNFetchBlob.fs.exists(`/storage/sdcard0/Android/data/com.myapp/files/Download/${name}.mp3`)
        .then((exist) => {
            if (exist) {
                /* I want to stop all playing audios here */
                var whoosh = new Sound(`/storage/sdcard0/Android/data/com.myapp/files/Download/${name}.mp3`, '', (error) => {
                    if (error) {
                        alert('failed to load the sound', error);
                        return;
                    }
                    alert('duration in seconds: ' + whoosh.getDuration() + 'number of channels: ' + whoosh.getNumberOfChannels());
                    alert(whoosh.isLoaded());

                    whoosh.play((success) => {
                        if (success) {
                            alert('successfully finished playing');
                        } else {
                            alert('playback failed due to audio decoding errors');
                            whoosh.reset();
                        }
                    });
                });
            } else {
                const url = `http://myresourcesite/${file}.mp3`;
                const headers = {};
                const config = {
                    downloadTitle: name,
                    downloadDescription: 'Downloading ...',
                    saveAsName: `${name}.mp3`,
                    allowedInRoaming: true,
                    allowedInMetered: true,
                    showInDownloads: true
                };
                downloadManager.download(url, headers, config).then((response) => {
                    alert('Download success!');
                }).catch(err => {
                    alert('Download failed!');
                });
            }
        })
        .catch(() => {
            alert('error has occured');
        });
}
4

1 回答 1

1

我认为没有 stopAll() 函数。您需要跟踪您创建的实例。我使用一个全局变量。通过一些逻辑,我可以确保一次只播放一种声音。

  • 当您创建一个新的声音对象时,将它分配给一个全局变量。
  • 在创建新的声音对象之前,停止全局实例上的声音
  • 为第一次单击添加对全局变量的空检查
var whoosh = new Sound(`/storage/sdcard0/Android/data/com.myapp/files/Download/${name}.mp3`, '', (error) => {
    if (error) {
        alert('failed to load the sound', error);
        return;
    }
    if (global.sound) global.sound.stop();
    global.sound = whoosh;
    whoosh.play( success => { console.log('Playing') } );
}

人们认为 JS 中的全局变量不好。如果你误用是。但是这种情况下它确实是一个全局对象,使用它没有任何问题。这不是滥用。

于 2019-02-19T04:02:24.617 回答