android MediaPlayer循环

android MediaPlayer循环,android,media-player,Android,Media Player,我尝试播放循环Ogg文件,我尝试启用setLooping(true),但没有效果,所以我尝试了onCompletionListener,但这也不起作用,有人能澄清我做错了什么吗 musicPlayer = MediaPlayer.create(mContext, R.raw.overworld); musicPlayer.setVolume(musicVolume, musicVolume); // musicPlayer.setLooping(true); musicPlayer.setOn

我尝试播放循环Ogg文件,我尝试启用
setLooping(true)
,但没有效果,所以我尝试了
onCompletionListener
,但这也不起作用,有人能澄清我做错了什么吗

musicPlayer = MediaPlayer.create(mContext, R.raw.overworld);
musicPlayer.setVolume(musicVolume, musicVolume);
// musicPlayer.setLooping(true);

musicPlayer.setOnCompletionListener(new OnCompletionListener() {

    @Override
    public void onCompletion(MediaPlayer mp) {
        musicPlayer.stop();
        musicPlayer.seekTo(0);
        musicPlayer.start();
        Log.d("Sound Manager", "Song Completed");
    }
});
以下是我的游戏功能

public void playSong(int id) {
    try {
        stopSong();
        musicPlayer = MediaPlayer.create(mContext, id);                                               
        musicPlayer.start(); 
    } catch(Exception e) {
        // Ignored
    }
}

众所周知,MediaPlayer在ogg文件方面存在问题。 您可以更倾向于切换到另一种文件格式

另一件事是,我会继续尝试setLooping(布尔值),因为它很可能使用相同的方案,而且更清晰


如果停止
MediaPlayer
对象,则调用seekTo()会导致MediaPlayer处于无效状态。您可以调用
pause()
,但我不会调用这些方法中的任何一个,为什么不只是查找呢?我猜如果您删除
musicPlayer.stop()
它会工作。

众所周知,MediaPlayer在ogg文件方面有问题。
remove ....
    musicPlayer.stop(); 
from
     onCompletion(MediaPlayer mp) 
您可以更倾向于切换到另一种文件格式

另一件事是,我会继续尝试setLooping(布尔值),因为它很可能使用相同的方案,而且更清晰

如果停止
MediaPlayer
对象,则调用seekTo()会导致MediaPlayer处于无效状态。您可以调用
pause()
,但我不会调用这些方法中的任何一个,为什么不只是查找呢?我猜如果您删除
musicPlayer.stop()
,它会工作。

onCompletionListener()
如果您的
MediaPlayer设置为循环,则不会调用它,但如果您没有将其设置为循环,则始终可以使用这样的完成侦听器

remove ....
    musicPlayer.stop(); 
from
     onCompletion(MediaPlayer mp) 
@Override
public void onCompletion(MediaPlayer mp) {
    if(!mp.isPlaying()) {
        mp.start();
    }
    mp.seekTo(0);
}
您也不应该调用
stop()
,因为这样会完全停止播放,而且在您未播放的视频/歌曲中查找也没有意义。

onCompletionListener()
如果您的
MediaPlayer
设置为循环,则不会调用
onCompletionListener()
,但如果您没有将其设置为循环,您总是可以像这样使用完成侦听器

@Override
public void onCompletion(MediaPlayer mp) {
    if(!mp.isPlaying()) {
        mp.start();
    }
    mp.seekTo(0);
}

您也不应该调用
stop()
,因为这样会完全停止播放,并且在您未播放的视频/歌曲中查找是没有意义的。

这是一首歌曲,不是SFX,同一文件的Mp3是3mb,而在Ogg格式中,它是600KB无更改的…Log.d永远不会显示在LogCat中,侦听器甚至没有启动?解决方案是在每次调用MediaPlayer.create或set musicPlayer.setLooping(true)后附加OnCompletionListener;每次呼叫MediaPlayer后。create@GideonKain酷!我想你无法从代码中看到这一点。当然,当MediaPlayer.create创建一个全新的实例时,它如何知道预先分配的MediaPlayer实例已设置循环(true)。)有没有一种方法可以在不使用MediaPlayer.create的情况下更改正在播放的声音?或者这就是它的工作方式?它是一首歌曲而不是SFX,同一个文件的Mp3是3mb,而在Ogg格式中它是600KB无更改…Log.d永远不会出现在LogCat中,侦听器甚至没有启动?解决方案是在每次调用MediaPlayer.create或set musicPlayer.setLooping(true)后附加OnCompletionListener;每次呼叫MediaPlayer后。create@GideonKain酷!我想你无法从代码中看到这一点。当然,当MediaPlayer.create创建一个全新的实例时,它如何知道预先分配的MediaPlayer实例已设置循环(true)。)有没有一种方法可以在不使用MediaPlayer.create?的情况下更改正在播放的声音,或者这就是它的工作方式?