Android 8.0後AudioFocusオーディオフォーカスを使用してオーディオプリエンプトの問題を処理

11283 ワード

今日はaudioを再生する簡単なdemoについて書きましたが、プログラムが他のオーディオを奪うことができないことに気づきました.具体的には、他のプレーヤーがaudioを再生しているときに、demoがaudioを再生すれば、2つのaudioが同時に再生されます.また、他のプレーヤーでも本プログラムのオーディオを奪うことができず、具体的にはdemoがaudioを再生している場合、他のプレーヤーがaudioを再生している場合、audioが同時に再生される場合もあります.インターネットで資料を調べると、AudioFocusに関するほとんどの資料の書き方がAndroid 8.0の前にとどまっていることが分かった.だから私は万能の公式文書(文末転送ドア)をめくって、このシールを開けて記録しました.
AudioFocus
まずAudioManagerインスタンスを取得
後でオーディオフォーカスを要求する場合はAudioManagerに登録する必要があります
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

AudioAttributesを使用してオーディオタイプ、用途を説明
Android 5.0からオーディオフォーカスを使用するには、Audio Attributesを使用してAudio Appが再生しているオーディオの種類を説明する必要があります.例えばスピーチ系のオーディオを再生している場合、タイプはCONTENT_です.TYPE_SPEECH.私のテストdemoは一般的な音楽を流しているので、ここの種類はCONTENT_です.TYPE_MUSIC. ここでは、USAGE_のようなオーディオの用途を設定することもできます.MEDIAは、オーディオがメディアファイルの再生に用いられることを示し、音楽、映画のトラックなどであってもよい.
AudioAttributes audioAttributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_GAME)
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .build();

AudioFocusRequestオブジェクトを作成し、onAudioFocusChangeメソッドを書き換えます.
AudioFocusRequestには、オーディオコンテキストおよび(プログラムがオーディオフォーカスを取得する)能力に関するいくつかの情報が含まれています.これらの情報は、オーディオのフォーカスの損失と取得を自動的に制御するために使用されます.オーディオフォーカスのリクエストはこのリクエストのタイプを指摘する必要があるので、ここではAudioFocusRequestを用いる.Builder()audioFocusRequestオブジェクトを作成し、タイプパラメータAUDOFOCUS_に入力します.GAINは、このrequestがオーディオフォーカスの取得を要求するために使用されることを示す.次に、様々な設定パラメータのAPIを呼び出して構築を完了し、以下にいくつかの重要なことを説明する:setAudioAttributes():Appの使用シーンを記述し、上に構築されたパラメータに直接入力すればよい.setWillPauseWhenDucked():Duckは「音量を下げる」という意味です.例えば、携帯電話が音楽を再生している間に短いオーディオ(例えばメール)が来た場合、音楽の音は低下する(ただし一時停止しない)ことでメールのヒント音が強調され、これはシステム自身が自動的に処理し、デフォルトではonAudioFocusChangeメソッドはコールバックされない(以下).この時点で音楽の再生を一時停止したい場合は、trueに転送してonAudioFocusChangeメソッドを書き換え、一時停止ロジックを追加します.setAcceptsDelayedFocusGain():オーディオフォーカスがプログラムによってロックされる場合があります.例えば、電話をかけるとき、他のオーディオが電話のオーディオフォーカスを奪うことに成功することはできません.電話がオーディオフォーカスに鍵をかけているからです.このとき他のソフトウェアからオーディオフォーカスが要求された場合、requestAudioFocus()はAUDOFOCUS_に戻ります.REQUEST_FAILED.したがってAndroidは、プログラムに遅延焦点の取得を処理させる「遅延受信」オーディオフォーカスのメカニズムを提供しています.trueが入力されると、requestAudioFocus()はAUDOFOCUS_を返します.REQUEST_DELAYEDは、オーディオフォーカスが解放されると、自動的にオーディオフォーカスを取得できます.
audioFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
                .setAudioAttributes(audioAttributes)
                .setOnAudioFocusChangeListener(new AudioManager.OnAudioFocusChangeListener() {
                    @Override
                    public void onAudioFocusChange(int focusChange) {
                        switch (focusChange){
                            case AudioManager.AUDIOFOCUS_GAIN:
                                if(!mediaPlayer.isPlaying()){
                                    mediaPlayer.start();
                                }
                                break;
                            case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
                                break;
                            case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
                                break;
                            case AudioManager.AUDIOFOCUS_LOSS:
                                if(mediaPlayer.isPlaying()){
                                    mediaPlayer.pause();
                                }
                                break;
                            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                                if(mediaPlayer.isPlaying()){
                                    mediaPlayer.pause();
                                }
                                break;
                            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                                break;
                            default:
                        }
                    }
                }).build();

setOnAudioFocusChangeListener():オーディオフォーカス変化の傍受を実現する方法で、AudioManagerを受信する.OnAudioFocusChangeListenerパラメータは、onAudioFocusChange()メソッドを書き換えます.この方法はfocusChangeパラメータを入力し、以下で少し説明します.ここでは、オーディオフォーカスが有効になる前提は、2つのオーディオを再生するAPPがオーディオフォーカスを実現することです.例を挙げると、プレーヤーがオーディオを再生している最中に、本プログラムがオーディオの再生を開始すると、本プログラムはオーディオフォーカスの取得を要求し、このときオーディオフォーカスがロックされていなければ、要求は成功し、コールバック方法はAUDOFOCUS_に転送される.GAINパラメータ、もう一つのプレーヤーもメソッドをコールバックしてAUDOFOCUSに転送します.LOSSパラメータは、オーディオフォーカスを失わせます.そのため、両方のプレーヤーがオーディオフォーカスを実現しなければなりません.しかし、今の音楽プレーヤーでは、この機能が実現しているに違いない.AUDIOFOCUS_LOSS:本プログラムがオーディオを再生している間に別のプレーヤーがオーディオフォーカスのオーディオ再生を要求すると、このメソッドがコールバックされ、このパラメータAUDOFOCUS_に転送されます.LOSS_TRANSIENT:別のプレーヤーが「短い」オーディオフォーカスの取得を要求すると、このパラメータAUDOFOCUS_に送信されます.LOSS_TRANSIENT_CAN_DUCK:他のプレーヤーから「短い」音声フォーカスを取得するように要求され、完全に一時停止しなくても音量を下げることができる場合、このパラメータAUDOFOCUSに入力します.GAIN:他のプレーヤーがオーディオを再生している場合、本プログラムはオーディオフォーカスを取得してオーディオを再生することを要求し、このパラメータAUDOFOCUS_に入力する.GAIN_TRANSIENT:このプログラムが「短い」オーディオフォーカスの取得を要求すると、このパラメータAUDOFOCUSに入力されます.GAIN_TRANSIENT_MAY_DUCK:このプログラムで「短い」オーディオフォーカスを要求し、相手の音量が低い場合にこのパラメータに伝わる可能性があることをご存知でしょうか.この6つのパラメータは互いに対応しています.
最後に、AudioManagerでオーディオフォーカスを要求します.
audioManager.requestAudioFocus(audioFocusRequest);

プログラムが終了したら、オーディオフォーカスを解放することを忘れないでください.
なお、ここで入力されるパラメータaudioFocusRequestは、前にオーディオフォーカスを申請したときと同じオブジェクトを使用します.
audioManager.abandonAudioFocusRequest(audioFocusRequest);

参考資料:Android公式ドキュメント:https://developer.android.google.cn/guide/topics/media-apps/audio-focus#java