Android MediaPlayer从服务调用prepareAsync()后回调未触发
我正在写一个小应用程序,将流mp3文件。我正在使用NPR代码,但mediaPlayer.prepareAsync()有一个奇怪的问题 我使用的是NPR应用程序中的精简版本,它已经正确启动。我在活动中的OnClick处理程序中获取对服务的引用,并使用MP3流的URL调用listen()。以下(简化)代码来自我的PlaybackService:Android MediaPlayer从服务调用prepareAsync()后回调未触发,android,service,media-player,Android,Service,Media Player,我正在写一个小应用程序,将流mp3文件。我正在使用NPR代码,但mediaPlayer.prepareAsync()有一个奇怪的问题 我使用的是NPR应用程序中的精简版本,它已经正确启动。我在活动中的OnClick处理程序中获取对服务的引用,并使用MP3流的URL调用listen()。以下(简化)代码来自我的PlaybackService: public void listen(String url) throws IllegalArgumentException, IllegalStateEx
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(),则媒体播放器将播放,因此它确实进入了准备状态
如果我用prepare()替换对prepareAsync()的调用,那么播放器就可以工作了。这都是关于2.2的,我一直在读的2.2似乎有一些问题,但我遇到的问题似乎并不相关,因为使用prepare()时流运行良好
我确实注意到流上的内容长度相当大(450MB),但由于我可以在媒体播放器上调用play而不会出现异常,因此它似乎可以处理这个问题
唯一的另一个变化是,在NPR应用程序中,该服务被绑定到一个视图对象中,并从该视图对象中开始播放(而在我的应用程序中,这发生在一个活动中)
关于我可能做错了什么有什么想法吗?请确保您已经在一个线程中创建了mediaplayer,该线程具有一个,这是回调正常工作所必需的。几乎每次我看到这些错误时,似乎都是mediaplayer无法解释的低级行为。