2011-02-01 9 views
2

私は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オブジェクト内から開始されたことです(アプリ内ではアクティビティ内で発生します)。

私は何が間違っている可能性について考えていますか?

+0

これらのエラーが表示されるたびに、MediaPlayerの説明できない低レベルの動作のようです。 –

答えて

3

コールバックが正しく機能するために必要な、looperのスレッドにmediaplayerを作成していることを確認してください。

関連する問題