Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MediaPlayer从服务调用prepareAsync()后回调未触发_Android_Service_Media Player - Fatal编程技术网

Android MediaPlayer从服务调用prepareAsync()后回调未触发

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

我正在写一个小应用程序,将流mp3文件。我正在使用NPR代码,但mediaPlayer.prepareAsync()有一个奇怪的问题

我使用的是NPR应用程序中的精简版本,它已经正确启动。我在活动中的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(),则媒体播放器将播放,因此它确实进入了准备状态

如果我用prepare()替换对prepareAsync()的调用,那么播放器就可以工作了。这都是关于2.2的,我一直在读的2.2似乎有一些问题,但我遇到的问题似乎并不相关,因为使用prepare()时流运行良好

我确实注意到流上的内容长度相当大(450MB),但由于我可以在媒体播放器上调用play而不会出现异常,因此它似乎可以处理这个问题

唯一的另一个变化是,在NPR应用程序中,该服务被绑定到一个视图对象中,并从该视图对象中开始播放(而在我的应用程序中,这发生在一个活动中)


关于我可能做错了什么有什么想法吗?

请确保您已经在一个线程中创建了mediaplayer,该线程具有一个,这是回调正常工作所必需的。

几乎每次我看到这些错误时,似乎都是mediaplayer无法解释的低级行为。