我在我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();
}
}
我怎样才能解决这个问题?
答案 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系统为您提供了IllStateException
。 mMediaPlayer.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
}