【发布时间】:2013-12-23 13:30:15
【问题描述】:
我现在遇到的问题是我的暂停并不总是有效。 我所拥有的是主要活动中的 MediaPlayer,它通过 ActionBarSherlock 和 onClick 侦听器进行操作。 MediaPlayer 使用 ArrayList 和 MP3 文件的 URL(其中一些长 1 秒)。
暂停代码:
if (player.isPlaying()) {
if (player != null) {
player.pause();
swapPlayIcon(1);
isPaused = true;
pauseMenuButt.setVisible(false);
playMenuButt.setVisible(true);
}
}
swapPlayIcon(int) 只处理可见性和可绘制交换。
起始代码:
Iterator<Uri> iterUri = tracks.iterator();
while (iterUri.hasNext()) {
Uri tmpUri = iterUri.next();
try {
player.reset();
player.setDataSource(String.valueOf(tmpUri));
player.prepare();
player.start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
编辑
经过更多测试,我发现问题出现在“中间”状态。
我的意思是,当我的 MP3 文件有 2 秒长并且我点击暂停时,它不会停止,因为它刚刚结束读取一个文件,现在转到下一个文件。
我已添加:
} else {
pauseLocked = true;
}
暂停如果语句并且在测试时它根本没有落在其中。 所以我不确定我之前发现的“中间”问题。
【问题讨论】:
-
不确定答案是什么,但重要的是要注意在第一个块中您可能会出现 NullPointerException ...您说 if(player.isPlaying()) 然后检查对于玩家!= null。如果 player 为 null,您将在调用 player.isPlaying() 时看到 NPE。您应该将空检查移出 isPlaying() if 语句,或者将其完全删除。
-
是的,你是对的:>
-
首先播放不会阻塞,因此您将尽可能快地循环播放媒体,因为播放器可以从您的 url 准备每个媒体流。第二,你在4.4 and are you trying to play HLSs吗?
-
没有我在 4.3 和 4.2 上测试它。 MP3 文件在设备上。
-
@JakubW 你明白第一个问题吗?最后,你是正确的,你不能在媒体播放器准备时执行暂停操作,但你永远无法做到这一点,因为你使用的是 prepare() 的阻塞版本,所以这就是你的 else 分支的原因块没有被击中。
标签: java android android-mediaplayer