私はmp3ファイルをストリームする小さなアプリケーションを作成しています。私はNPRコードを使用していますが、mediaPlayer.prepareAsync()に奇妙な問題があります。サービスからprepareAsync()を呼び出した後にMediaPlayerコールバックが起動しない
私はPlaybackServiceのトリミングダウンバージョンを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();
}
私は他のコールバックも定義しています。
AwesomePlayer I calling prefetcher->prepare()
AwesomePlayer I prefetcher is done preparing
しかし、私のonPrepared法と呼ばれることは決してありません:私は次のメッセージを見るように私は、MediaPlayerのは、ストリームとバッファリングをロードしていることをLogCatから見ることができます。上記のログメッセージが表示された後に、タイマーを追加してMediaPlayerでplay()を呼び出そうとすると、メディアプレーヤーが再生されるため、実際にPrepared状態になります。
prepareAsync()の呼び出しをprepare()に置き換えた場合、プレーヤーは動作します。これは私が読んでいた2.2のすべてですが、いくつかの問題があるようですが、prepare()が使用されたときにストリームがうまく動作するので、私が持っている問題は関連していないようです。
ストリームのContent-Lengthがかなり大きい(450MB)ことがわかりましたが、例外なくMedia Playerで再生を呼び出すことができるため、これを処理しているようです。
唯一の変更点は、NPRアプリケーションではサービスがバインドされており、再生はViewオブジェクト内から開始されたことです(アプリ内ではアクティビティ内で発生します)。
私は何が間違っている可能性について考えていますか?
これらのエラーが表示されるたびに、MediaPlayerの説明できない低レベルの動作のようです。 –