MediaPlayer中的IllegalStateException设置数据源方法

时间:2016-09-15 11:09:01

标签: android

我在我onCompletion的{​​{1}}监听器中使用以下代码,我正在重复当前的歌曲。

MediaPlayer

但是我收到以下错误消息,

if (isRepeat) {
                if (mMediaPlayer.isPlaying()) {
                    mMediaPlayer.stop();
                    mMediaPlayer.reset();
                }
                try {
                    mMediaPlayer.setDataSource(MainActivity.localTrackList.get(MainActivity.currentOffset).getPath());
                    mMediaPlayer.prepareAsync();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

我怎样才能解决这个问题?

3 个答案:

答案 0 :(得分:4)

如果您的MediaPlayer没有播放任何内容或音轨结束,则不会重置。从mMediaPlayer.reset();中取出条件

try {
    mMediaPlayer.reset();
    mMediaPlayer.setDataSource(MainActivity.localTrackList.get(MainActivity.currentOffset).getPath());
    mMediaPlayer.prepareAsync();
} catch (IOException e) {
    e.printStackTrace();
}

在使用reset()之前,您应该致电setDataSource()

如果媒体正在播放,你的情况绝对是写的,但是当曲目结束时它就会变错。

答案 1 :(得分:2)

MediaPlayer.setDataSource()仅在MediaPlayer状态为空闲时有用,您在onCompletion中调用此方法,因此android系统为您提供了IllStateExceptionmMediaPlayer.isPlaying()似乎总是在onCompletion方法中返回false。

实际上您不需要再次setDataSource,您只需拨打MediaPlayer.start()即可从开始播放数据。

请参阅此状态图(取自https://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram):

答案 2 :(得分:1)

让我们假设您具有歌曲列表,并且在单击歌曲时必须播放文件中的歌曲。 您需要再次重新初始化MediaPlayer 。设置isLooping是可选的

这里的文件路径来自内部目录“ /system/media/audio/alarms/Osmium.ogg

fun onItemClick(item: FetchMedia.SongModel) {
    if(mediaPlayer.isPlaying){
        mediaPlayer.isLooping = false
        mediaPlayer.stop()
    }
    mediaPlayer = MediaPlayer()
    mediaPlayer.setDataSource(item.DATA)
    mediaPlayer.prepare()
    mediaPlayer.start()
    mediaPlayer.isLooping = true
}