Android mediaplayer仅在较新设备上出现音频故障/口吃

Android mediaplayer仅在较新设备上出现音频故障/口吃,android,audio,android-mediaplayer,nexus-5,nexus-10,Android,Audio,Android Mediaplayer,Nexus 5,Nexus 10,我有一个相当标准的mediaplayer对象,在我的应用程序中以onCreate和循环方式启动背景音乐。这个文件不是特别大,它是一个6MB的MP3。从onCreate: MediaPlayer mp; mp = MediaPlayer.create(MainActivity.this, R.raw.lostmexicancity); mp.setLooping(true); mp.setVolume(0.4f, 0.4f); mp.start(); 这在我的大多数测试设备上都能正常工作,包括老

我有一个相当标准的mediaplayer对象,在我的应用程序中以onCreate和循环方式启动背景音乐。这个文件不是特别大,它是一个6MB的MP3。从onCreate:

MediaPlayer mp;
mp = MediaPlayer.create(MainActivity.this, R.raw.lostmexicancity);
mp.setLooping(true);
mp.setVolume(0.4f, 0.4f);
mp.start();
这在我的大多数测试设备上都能正常工作,包括老式手机、三星Galaxy Tab 2 10英寸平板电脑,甚至Nexus 4

不幸的是,我只在新设备上遇到问题,我在Nexus 5和新Nexus 10上遇到音频故障/口吃。这些问题只会在新设备上发生,通常是在正确播放几秒钟后,而不是立即发生。我的Nexus 4和5都运行Android 4.4.4,但问题只会发生在Nexus5上

当我暂停mediaplayer对象并在短时间内播放另一个对象(游戏中短时间战斗的战斗音乐)时,这个问题似乎会加剧,但即使没有这种额外的复杂性,故障也会发生

我读到安卓系统的新版本导致Mediaplayer出现问题,但我还没有找到解决办法或建议


有没有其他人遇到过这个问题,可以建议解决方法或解决方法?谢谢您抽出时间!

我也注意到在我的Android设备上发生了这种情况

我注意到您没有调用Prepare(),这是播放音频之前的一个重要函数。 编辑——只有在使用new创建MediaPlayer时,才需要调用prepare,而不是使用内置的MediaPlayer.Create()创建MediaPlayer

至于在资源之间切换时的问题,我建议打电话给SeekTo()您希望播放音频并使用SeekComplete监听器等待该位置的确切时间。在评论中,我有一小行黑客代码,在调用开始后才在mediaPlayer上设置音量。这似乎可以减少口吃,但您可能会丢失第一小部分音频

我使用的是XamarinStudioC#,但即使您使用的是Java,这种方法也应该有效

MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.SetAudioStreamType (Android.Media.Stream.Music);
mediaPlayer.SetDataSource ("dataSourcePath");

mediaPlayer.Looping = true;

//It is necessary to call prepare after setting the data source
mediaPlayer.Prepare ();

//Ensure the audio has seeked to the position you need
bool seekingComplete = false;
mediaPlayer.SeekComplete += (object sender, EventArgs e) => {
    seekingComplete = true;
};

mediaPlayer.SeekTo(0);

//Forces the audio to complete seeking
while(seekingComplete == false)
{
    //Here, you just wait 2 milliseconds at a time 
    //for this buffering and seeking to complete
    await Task.Delay(2);
}

mediaPlayer.Start();

//Hacky way to prevent the glitch sound at the start is to set the
//volume after calling start
//mediaPlayer.SetVolume(0.4f, 0.4f);

我有一个类似的问题,并通过在查找之前总是暂停媒体播放器来解决。类似于以下的方法对我有效:

if (mediaPlayer.isPlaying()) {
    mediaPlayer.pause();
    mediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete(MediaPlayer mp) {
            mp.start();
            mp.setOnSeekCompleteListener(null);
        }
    });
}
mediaPlayer.seekTo(pos);

调用
MediaPlayer.create()
会自动准备音频。您绝对不应该再次调用它。从文档中可以看到:“为给定Uri创建MediaPlayer的便捷方法。如果成功,prepare()将已被调用,不能再次调用。“您找到解决此问题的方法了吗?”?