メディアプレーヤーの開発中に、同様の状況に遭遇しました。私の解決策は、AudioManager のOnAudioFocusChangeListener
.
そのようにクラスにリスナーを実装します
public class VideoPlayerHelper implements AudioManager.OnAudioFocusChangeListener {
次に、オーバーライドしますonAudioFocusChange
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
//Just fall through by omitting break
case AudioManager.AUDIOFOCUS_LOSS:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
LogUtil.log(LogUtil.DEBUG, TAG, "AUDIOFOCUS_LOSS or AUDIOFOCUS_LOSS_TRANSIENT"); //Custom logging class
if (isPlaying()) {
pause();
mAudioManager.abandonAudioFocus(VideoPlayerHelper.this);
}
break;
case AudioManager.AUDIOFOCUS_GAIN:
LogUtil.log(LogUtil.DEBUG, TAG, "AUDIOFOCUS_GAIN"); //Custom logging class
break;
default:
break;
}
}
ここでの鍵はAudioManager.AUDIOFOCUS_LOSS_TRANSIENT
. これは、目覚まし時計が鳴ったときにリスナーが受信し続けたコードでした(The Note 5で)。そのため、メディア プレーヤーを一時停止し、オーディオ フォーカスを手放すのAudioManager.AUDIOFOCUS_LOSS_TRANSIENT
と同じように処理しました。AudioManager.AUDIOFOCUS_LOSS
メディア プレーヤーをセットアップするとき、データ ソースを追加する前に次の行を追加しました。
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
メディア プレーヤーを起動するためのコードにもこの行が含まれていることを確認してください (onResume
アプリがバックグラウンドで動作しているときにアラームが鳴った場合に備えて、開始コードとコードに含まれています)。
mAudioManager.requestAudioFocus(VideoPlayerHelper.this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
その行は、目覚まし時計を閉じた後に再生ボタンを押したときにオーディオフォーカスを取り戻すのに役立ちます.
また、メディア プレーヤーを使い終わったら、オーディオ フォーカスをオフにする必要があります。このコード行をonStop
andonDetach
メソッドに入れました。
mAudioManager.abandonAudioFocus(VideoPlayerHelper.this);
思ったほど多くの設定は必要なく、予期しないオーディオ (目覚まし時計やタイマーが鳴るなど) が発生したときにいつでもメディア プレーヤーを調整できます。