我在React-Native项目中使用了expo Audio,并且已经设法通过按一个按钮来播放声音(呼啦!),但是,如果我按了两次播放按钮,则声音会重复播放两次彼此顶部。
我尝试在音频开始播放后禁用该按钮,然后使用.then语句再次启用它,但是事实证明,音频开始后(而不是停止)立即调用.then语句。我以为我也可以通过检查音频是否已经在播放来做到这一点,但是我看了一下文档,似乎无法弄清楚如何访问isPlaying属性。
可在此处找到文档:https://docs.expo.io/versions/latest/sdk/audio/
我尝试了一些不同的console.logs来找到正确的信息,但是未能成功访问它。有人知道如何检查我的声音是否在播放吗?感谢所有帮助。
这是我的功能:
playSoundLocation = async (location) => {
this.setState({playing: true});
Audio.setIsEnabledAsync(true);
const soundObject = new Audio.Sound();
// console.log(Audio.isPlaying);
await soundObject.loadAsync({ uri: location })
.catch(err => { console.log(err) });
// console.log(Audio.isPlaying);
await soundObject.playAsync()
.catch(err => { console.log(err) })
.then(()=>{this.setState({playing: false})}); //calls as soon as soundstarts. Should call once ended.
console.log(Audio);
console.log(Audio.playbackStatus);
}
问题编辑
我设法将上述功能更改为:
playSoundLocation = async (location) => {
let playingResponse = false;
if(this.state.curSoundObject !== null){
await this.state.curSoundObject.getStatusAsync().then( response=>{playingResponse = response.isPlaying})}
if(playingResponse === false){
Audio.setIsEnabledAsync(true);
const soundObject = new Audio.Sound();
await soundObject.loadAsync({ uri: location })
.catch(err => { console.log(err) });
await soundObject.playAsync()
.catch(err => { console.log(err) });
this.setState({curSoundObject: soundObject});
}
}
此功能不允许已经播放的声音播放,但是它不会禁用按钮(这样做更有意义,并且对用户来说更好看)。如果添加setState,我将得到与以前相同的问题。声音播放完毕后,我需要调用一个函数-有人知道该怎么做吗?