【发布时间】:2011-02-01 03:08:38
【问题描述】:
我正在编写一个可以流式传输 mp3 文件的小应用程序。我正在使用 NPR 代码,但 mediaPlayer.prepareAsync() 有一个奇怪的问题。
我正在使用 NPR 应用程序中的PlaybackService 的精简版本,它正在正确启动。我在 Activity 中的 OnClick 处理程序中获取对服务的引用,并使用指向 MP3 流的 URL 调用 listen()。以下(简化)代码来自我的 PlaybackService:
public void listen(String url) throws IllegalArgumentException, IllegalStateException, IOException {
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
}
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnErrorListener(this);
mediaPlayer.setOnInfoListener(this);
mediaPlayer.setOnPreparedListener(this);
synchronized (this) {
mediaPlayer.setDataSource(url);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepareAsync();
}
}
// ... lots of other code
@Override
public void onPrepared(MediaPlayer mp) {
Log.d(LOG_TAG, "Prepared");
play();
}
我还定义了其他回调。我可以从 LogCat 中看到 MediaPlayer 正在加载流和缓冲,因为我看到了以下消息:
AwesomePlayer I calling prefetcher->prepare()
AwesomePlayer I prefetcher is done preparing
但是我的 onPrepared 方法永远不会被调用。如果我在看到上述日志消息后添加一个计时器并尝试在某个时间点调用 MediaPlayer 上的 play(),则媒体播放器会播放,因此它确实进入了 Prepared 状态。
如果我用 prepare() 替换对 prepareAsync() 的调用,播放器就会正常工作。这都是关于 2.2 的,我一直在阅读的似乎有一些问题,但我遇到的问题似乎并不相关,因为使用 prepare() 时流工作正常。
我确实注意到流上的 Content-Length 非常大(450MB),但由于我可以在媒体播放器上调用播放而不会出现异常,它似乎可以处理这个问题。
唯一的其他变化是,在 NPR 应用程序中,服务被绑定并从 View 对象内部开始播放(而在我的应用程序中,这发生在 Activity 内部)。
有什么想法我可能做错了吗?
【问题讨论】:
-
几乎每次我看到这些错误时,似乎都是 MediaPlayer 无法解释的低级行为。
标签: android service media-player