ここで明らかな何かが欠けているはずですが、MediaPlayerがオーディオをバッファリングしているときを判断するための何かを見つけることができません。インターネットオーディオをストリーミングしていて、バッファーインジケーターを表示したいのですが、MediaPlayerがオーディオをバッファーに中断したときに、バッファーインジケーターを適切に表示できないので、これを試したことはありません。手がかりはありますか?
@ Daniel、@ JRLの回答に関するコメントに従って、スレッドを起動してタイムアウトを待つことで、これを機能させることができます。
DetectBufferTimeout.Java (unested)のようなものはうまくいきます。
ただし、この個別のスレッドをスピンアップすることは少しハックのようであることに同意します。おそらくOnBufferingUpdateListener
は、バッファリングの進行状況に変化があったかどうかに関係なく、onBufferingUpdate()
を呼び出す頻度を保証できるため、同じ値が繰り返し取得されているかどうかを検出できます。
以下のように(APIレベル≥9):
mp.setOnInfoListener(new OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
loadingDialog.setVisibility(View.VISIBLE);
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
loadingDialog.setVisibility(View.GONE);
break;
}
return false;
}
});
注:Androidには既知のバグがあります。 HLSストリームを再生するとき、OnInfoListenerまたはOnBufferingを呼び出すことはありません。このリンクをチェックしてください OnInfoListenerバグ
さて、私は今少し正当化されたと感じています。 Pandoraアプリをチェックアウトしたところ、バッファリングインジケーターが表示されません。バッファリングのために音楽が中断されると、何も起こらなかったかのように音楽がそのまま表示され、UIはまだ再生されているように見えます。 MediaPlayerを使用している場合、バッファリングのためにトラックが一時的に一時停止されているかどうかを判断することはできないという結論に達しました。
ただし、使用できるMediaPlayer定数が2つあることに気付きました。MEDIA_INFO_BUFFERING_STARTとMEDIA_INFO_BUFFERING_ENDです。しかし、それらはAPIレベル9以上でのみ利用可能であり、ドキュメントはそれらについて何も述べていません。 OnInfoListenerで使用できることを前提としています。
がっかりしましたが、少なくとも今はホイールの回転をやめて、別のことに移ることができます。
OnBufferingUpdate リスナーを登録します。
MediaPlayerの現在の位置を確認するスレッドを使用できます。位置が変わらない場合は、メディアがバッファリング状態にあると結論付けることができます。これが私が書いた完全なチュートリアルです: http://www.ottodroid.net/?p=26