ここで明らかな何かが欠けている必要がありますが、MediaPlayer がいつオーディオをバッファリングしているかを判断できるものを見つけることができないようです。インターネット オーディオをストリーミングしていて、バッファリング インジケーターを表示したいのですが、MediaPlayer がいつオーディオのバッファリングを中断したかを知ることができないため、バッファリング インジケーターを適切に表示できません。手がかりはありますか?
6 に答える
以下のように (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 を使用している場合、トラックが一時的にバッファリングのために一時停止されているかどうかを判断することは不可能であるという結論に達しました。
ただし、MEDIA_INFO_BUFFERING_START と MEDIA_INFO_BUFFERING_END という、いくつかの MediaPlayer 定数が使用できることに気付きました。しかし、それらは API レベル 9+ でのみ利用可能であり、ドキュメントにはそれらについて何も記載されていません。OnInfoListener で使用できると仮定しています。
がっかりしましたが、少なくとも今は車輪を回すのをやめて、別のことに移ることができます。
@Daniel、@JRLの回答に関するコメントによると、スレッドをスピンアップしてタイムアウトを待つことで、おそらくこれを機能させることができます。
DetectBufferTimeout.java (未テスト)のようなものがうまく機能します。
ただし、この別のスレッドをスピンアップするのはちょっとしたハックであることに同意します。おそらく、バッファリングの進行状況に変化があったかどうかに関係なく、OnBufferingUpdateListener
呼び出しの頻度を保証して、同じ値を何度も取得しているかどうかを検出できるようにすることができます。onBufferingUpdate()
OnBufferingUpdateリスナーを登録します。
MediaPlayer の現在位置を確認するスレッドを使用できます。位置が変わらない場合は、メディアがバッファリング状態にあると結論付けることができます。ここに私が書いた完全なチュートリアルがあります: http://www.ottodroid.net/?p=260