React native 如何测试音频是否已经播放?世博音频

React native 如何测试音频是否已经播放?世博音频,react-native,expo,React Native,Expo,我在我的React Native项目中使用expo Audio,我已经成功地在按下按钮时播放了一个声音(万岁!),但是,如果我按下两次播放按钮,声音会在彼此上方播放两次 我尝试在音频开始播放后禁用该按钮,然后使用.then语句再次启用该按钮,但结果表明,.then语句在音频开始(而不是停止)时立即被调用。我想我也可以通过检查音频是否已经播放来做到这一点,但是我看了文档,似乎不知道如何访问isPlaying属性 文档可在此处找到: 我尝试了几个不同的console.log来查找正确的信息,但未能成

我在我的React Native项目中使用expo Audio,我已经成功地在按下按钮时播放了一个声音(万岁!),但是,如果我按下两次播放按钮,声音会在彼此上方播放两次

我尝试在音频开始播放后禁用该按钮,然后使用.then语句再次启用该按钮,但结果表明,.then语句在音频开始(而不是停止)时立即被调用。我想我也可以通过检查音频是否已经播放来做到这一点,但是我看了文档,似乎不知道如何访问isPlaying属性

文档可在此处找到:

我尝试了几个不同的console.log来查找正确的信息,但未能成功访问它。有人知道如何检查我的声音是否在播放吗?非常感谢您的帮助

以下是我的功能:

  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,我将得到与以前相同的问题。声音播放完毕后,我需要调用一个函数-有人知道怎么做吗?

soundObject.setOnPlaybackStatusUpdate怎么样??您好,我以为这是一个用于设置显示的函数:true或false。如何查看原始值?您可以使用
setOnPlaybackStatusUpdate
更新状态变量
playing
,并且在
playSoundLocation
的一开始,您可以检查声音是否正在播放,并相应地进行操作(播放或不播放声音)。您可能想检查
这个.state
。好的,但是一旦声音播放完毕,我如何知道,这样我就可以重新更改状态并重新启用按钮?我已经尝试添加一个事件侦听器:soundObject.addEventListener('ended',(event)=>{console.log('sound has finished');}),但是soundObject.addEventListener不是一个函数:/。soundObject.setOnPlaybackStatusUpdate怎么样?嗨,我以为这是一个用来设置isplay:true或false的函数。如何查看原始值?您可以使用
setOnPlaybackStatusUpdate
更新状态变量
playing
,并且在
playSoundLocation
的一开始,您可以检查声音是否正在播放,并相应地进行操作(播放或不播放声音)。您可能希望检查
此.state
。好的,但是一旦声音播放完毕,我如何知道,以便我可以重新更改状态并重新启用按钮?我已尝试添加一个事件侦听器:soundObject.addEventListener('ended',(event)=>{console.log('sound has finished');}),但soundObject.addEventListener不是一个函数:/。