MediaPlayer中的IllegalStateException设置数据源方法

Lea*_*ner 3 android

我在重复当前歌曲的onCompletion听众中使用以下代码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();
                }
            }
Run Code Online (Sandbox Code Playgroud)

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

  at android.media.MediaPlayer._setDataSource(Native Method)
09-15 09:05:19.884 12545-12545/ W/System.err:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1115)
09-15 09:05:19.884 12545-12545/ W/System.err:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1100)
09-15 09:05:19.884 12545-12545/ W/System.err:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1079)
09-15 09:05:19.884 12545-12545/ W/System.err:     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1028)
Run Code Online (Sandbox Code Playgroud)

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

Rav*_*avi 5

如果您的MediaPlayer没有播放任何内容或曲目已结束,则不会重置它。让您mMediaPlayer.reset();摆脱困境

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

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

如果媒体正在播放,则您的条件绝对是可写的,但是当轨道结束时,它会变为假。


L. *_*ter 3

MediaPlayer.setDataSource()仅当MediaPlayer状态为空闲时才有用,您调用了此方法,onCompletion因此 android 系统给了您一个IllStateException. mMediaPlayer.isPlaying()方法中似乎总是返回 false onCompletion

其实你不需要setDataSource再次调用,只需调用MediaPlayer.start()从头开始播放数据即可。

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