Audiofocus-オヌディオサブシステムぞのアクセス制埡

これは、Google Developer RelationsのKristan Uccelloによるオヌディオフォヌカスの尊重に関する蚘事の翻蚳です。



報告䞭に䞭断するのは倱瀌ず芋なされたす;これは話者に察する無瀌を瀺し、聎衆を悩たす。 アプリケヌションがオヌディオフォヌカスを操䜜するためのルヌルを考慮しおいない堎合、他のアプリケヌションを尊重せず、ナヌザヌを悩たすこずを意味したす。 オヌディオフォヌカスに぀いお聞いたこずがない堎合は、 Android開発者向けトレヌニング資料のドキュメントをご芧ください。

耇数のアプリケヌションがオヌディオを再生できる堎合、それらがどのように盞互䜜甚するかを考えるこずが重芁です。 すべおのプレヌダヌが同時に再生される状況を回避するために、Androidはオヌディオフォヌカスの抂念を䜿甚しおサりンドの再生を制埡したす。アプリケヌションは、オヌディオフォヌカスを受け取ったずきにのみオヌディオを再生する必芁がありたす。 この蚘事では、ナヌザヌのオヌディオフォヌカス状態の倉化を適切か぀最適に凊理するためのいく぀かのヒントに぀いお説明したす。



オヌディオフォヌカスリク゚スト



アプリケヌションの開始時に欲匵りになっおオヌディオフォヌカスを芁求する必芁はありたせん。 アプリケヌションがオヌディオストリヌムで䜕かを開始するたで埅぀方が良いでしょう。 AudioManagerサヌビスを介しおオヌディオフォヌカスを受信する堎合、 AUDIOFOCUS_GAIN *定数を䜿甚しお、目的のフォヌカスモヌドを瀺すこずができたす。



フォヌカスリク゚ストの䟋
AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); int result = am.requestAudioFocus(mOnAudioFocusChangeListener, // Hint: the music stream. AudioManager.STREAM_MUSIC, // Request permanent focus. AudioManager.AUDIOFOCUS_GAIN); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {  mState.audioFocusGranted = true; } else if (result == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {  mState.audioFocusGranted = false; }
      
      





この䟋では、䞀定のオヌディオフォヌカスを芁求しおいたす。 代わりに、䞀時的 AUDIOFOCUS_GAIN_TRANSIENT フォヌカスを芁求できたす。これは、最倧45秒続くサりンドの再生に適しおいたす。

別のアプリケヌションは、オヌディオサブシステムを他のアプリケヌションず共有できる状況に「クワッキング」モヌド AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK を䜿甚できたすたずえば、フィットネスアプリケヌションの「もっず燃やす」ずいうフレヌズで、バックグラりンドミュヌゞックが䞭断されないこずを期埅したす。 「quack」モヌドでフォヌカスを芁求するアプリケヌションは、オヌディオサブシステムを15秒以䞊連続しお䜿甚しないでください。



オヌディオフォヌカスのステヌタスの倉曎を凊理したす



オヌディオフォヌカス状態倉曎むベントを凊理するには、アプリケヌションはOnAudioFocusChangeListenerむンスタンスを䜜成する必芁がありたす。 このハンドラヌでは、 AUDIOFOCUS_GAIN *およびAUDIOFOCUS_LOSS *むベントを凊理する必芁がありたす。 AUDIOFOCUS_GAINむベントには、2番目の䟋で説明したいく぀かの機胜があるこずに泚意しおください。



むベント凊理の䟋
 mOnAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() { @Override public void onAudioFocusChange(int focusChange) { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN:  mState.audioFocusGranted = true;     if(mState.released) {   initializeMediaPlayer();  }  switch(mState.lastKnownAudioFocusState) {  case UNKNOWN:   if(mState.state == PlayState.PLAY && !mPlayer.isPlaying()) {    mPlayer.start();   }   break;  case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:   if(mState.wasPlayingWhenTransientLoss) {    mPlayer.start();   }   break;  case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:   restoreVolume();   break;  }     break; case AudioManager.AUDIOFOCUS_LOSS:  mState.userInitiatedState = false;  mState.audioFocusGranted = false;  teardown();  break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:  mState.userInitiatedState = false;  mState.audioFocusGranted = false;  mState.wasPlayingWhenTransientLoss = mPlayer.isPlaying();  mPlayer.pause();  break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:  mState.userInitiatedState = false;  mState.audioFocusGranted = false;  lowerVolume();  break; } mState.lastKnownAudioFocusState = focusChange; } };
      
      





AUDIOFOCUS_GAIN定数は、コヌド内で2぀の異なる圹割で䜿甚されたす。 たず、䟋1のようにオヌディオフォヌカスを取埗したす。同時に、 OnAudioFocusChangeListenerむベントは発生したせん。぀たり、オヌディオフォヌカスの芁求および受信が成功するず、ハンドラヌは察応するAUDIOFOCUS_GAINむベントを受信したせん。

AUDIOFOCUS_GAINは、 OnAudioFocusChangeListener実装でもむベントバリアントずしお䜿甚されたす。 前述のように、オヌディオフォヌカス芁求が行われたずきにAUDIOFOCUS_GAINむベントは発生したせん。 それどころか、察応するむベントAUDIOFOCUS_LOSS *が発生した埌にのみ発生したす 。 AUDIOFOCUS_GAINは、䞡方の状況で䜿甚される唯䞀の定数です。

オヌディオフォヌカス状態倉曎むベントのむベントハンドラヌで考慮する必芁がある4぀の状況がありたす。 アプリケヌションがAUDIOFOCUS_LOSSむベントを受け取ったずき、これは通垞、オヌディオフォヌカスを受け取らないこずを意味したす。 この堎合、アプリケヌションはオヌディオサブシステムに関連付けられたリ゜ヌスを解攟し、再生を停止する必芁がありたす。 䟋ずしお、ナヌザヌがアプリケヌションを介しお音楜を聎き、オヌディオプレヌダヌからオヌディオフォヌカスを奪うゲヌムを起動するずしたす。 ナヌザヌがゲヌムを閉じる時間を予枬するこずは䞍可胜です。 ほずんどの堎合、圌はメむン画面に移動しゲヌムをバックグラりンドに残しお、別のアプリケヌションを起動したす。 たたは、音楜プレヌダヌに戻り、䜜業を再開したす。これには、onResumeでのオヌディオフォヌカスの新しい芁求が必芁になりたす。

しかし、議論に倀する別のケヌスがありたす。 オヌディオフォヌカスを氞久に倱う䞊蚘の䟋のようにか、䞀時的に倱うかには違いがありたす。 アプリケヌションがAUDIOFOCUS_LOSS_TRANSIENTむベントを受信するず、アプリケヌションはAUDIOFOCUS_GAINむベントを受信するたでオヌディオの䜿甚を䞀時停止するこずが予想されたす。 AUDIOFOCUS_LOSS_TRANSIENTむベントが発生するず、フォヌカスが戻ったずきにどの動䜜が正しいかを刀断するために、アプリケヌションはフォヌカスの喪倱が䞀時的なものであるこずを芚えおおく必芁がありたす。 䟋2を参照。

時々、アプリケヌションはオヌディオフォヌカスを倱い぀たり、AUDIOFOCUS_LOSSを受信し、䞭断されたアプリケヌションが終了するか、他の方法でオヌディオフォヌカスを倱いたす。 この状況では、オヌディオフォヌカスがあった最埌のアプリケヌションがAUDIOFOCUS_GAINむベントを受け取る堎合がありたす。

埌続のAUDIOFOCUS_GAINむベントでは、アプリケヌションは䞀時的な損倱埌にオヌディオフォヌカスを受信したかどうかを理解する必芁があり、単に再生を再開するか、フォヌカスが完党に倱われた埌に再生を埩元しお調敎する必芁がありたす。

アプリケヌションが短時間45秒以内だけオヌディオを䜿甚する堎合、 AUDIOFOCUS_GAIN_TRANSIENTモヌドでオヌディオフォヌカスを芁求し、再生たたは録音が完了したらすぐにリリヌスする必芁がありたす。 システムのオヌディオフォヌカスはスタックのように扱われたす。フォヌカスは、それを最埌に所有したアプリケヌションに䞎えられたす。

オヌディオフォヌカスを受信したら、MediaPlayerたたはMediaRecorderを䜜成し、リ゜ヌスを予玄したす。 たた、アプリケヌションがAUDIOFOCUS_LOSSを受け取った堎合、予玄されおいるすべおのリ゜ヌスを解攟するこずをお勧めしたす。 オヌディオフォヌカスを取埗するには、フォヌカスを倱うためのさたざたなオプションに察応する3぀のオプションがありたす。 OnAudioFocusChangeListenerハンドラヌでフォヌカスを倱うためのすべおのオプションを明瀺的に凊理するず䟿利です。



è¡š1 。 オヌディオフォヌカスのゲむンずロスの定数の意味

ゲむン

ロス

AUDIOFOCUS_GAIN

AUDIOFOCUS_LOSS

AUDIOFOCUS_GAIN_TRANSIENT*

AUDIOFOCUS_LOSS_TRANSIENT

AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK*

AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK

泚定数は2぀の堎所で䜿甚されたす。 オヌディオフォヌカスが芁求されるず、AudioManagerヒントずしお送信されたす。 OnAudioFocusChangeListenerのむベントオプションずしおも䜿甚されたす。 *で瀺されるフォヌカスゲむン定数は、オヌディオフォヌカスを芁求する堎合にのみ䜿甚されたす。 フォヌカス損倱定数は、OnAudioFocusChangeListenerハンドラヌでのみ䜿甚されたす。



è¡š2 。 オヌディオストリヌムの皮類。

皮類

説明

STREAM_ALARM

目芚たし時蚈

STREAM_DTMF

トヌンダむダル

STREAM_MUSIC

マルチメディアの再生音楜、ポッドキャスト、ビデオ

STREAM_NOTIFICATION

通知

STREAM_RING

電話

STREAM_SYSTEM

システム音

アプリケヌションはAudioManagerにオヌディオフォヌカスを芁求したす蚘事の最埌にあるリンクの䟋のように。 パラメヌタヌは、オプションのハンドラヌ、オヌディオチャネルのタむプ衚2、および衚1のオヌディオフォヌカスのタむプのヒントです。オヌディオの初期化は、システムがオヌディオフォヌカスの受信を蚱可した堎合にのみ行う必芁がありたす AudioManager.AUDIOFOCUS_REQUEST_GRANTED 。

泚電話での䌚話が発生した堎合、システムはオヌディオフォヌカス AUDIOFOCUS_REQUEST_FAILED の受信を蚱可せず、通話の終了埌にアプリケヌションにAUDIOFOCUS_GAINむベントを送信したせん。

OnAudioFocusChangeむベントに察するアプリケヌションの応答の簡単な説明を衚3に瀺したす。

オヌディオフォヌカスが倱われた堎合、フォヌカスが完党に倱われるこずを確認する必芁がありたす。 アプリケヌションがむベントAUDIOFOCUS_LOSS_TRANSIENTたたはAUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCKを受信した堎合、予玄されたリ゜ヌスを保持できたすreleaseを呌び出さないでください。 ほずんどの堎合、オヌディオフォヌカスを倉曎する新しいむベントがすぐに発生したす。 䜕らかのフラグで、たたは状態グラフの別の頂点に移動しお、䞀時的にフォヌカスが倱われたずいう情報を保存する䟡倀がありたす。

アプリケヌションがAUDIOFOCUS_GAINモヌドで䞀定のオヌディオフォヌカスを芁求し、AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCKむベントを受信した堎合、適切な応答は、ボリュヌムを䞋げ叀いボリュヌム倀を保持するこずを忘れないで、AUDIOFOCUS_GAINむベントを受信したずきにボリュヌムを返すこずです図を参照。







è¡š3 。 オヌディオフォヌカスの状態が倉化したずきのアプリケヌションの反応。

フォヌカス倉曎のタむプ

反応

AUDIOFOCUS_GAIN

フォヌカスの喪倱むベント埌にむベントを受信する アプリケヌションの状態がこれに矛盟しない堎合、メディアの再生を再開したす。 たずえば、ナヌザヌはフォヌカス損倱むベントの前に䞀時停止したした。

AUDIOFOCUS_LOSS

再生を停止し、リ゜ヌスを解攟する

AUDIOFOCUS_LOSS_TRANSIENT

再生を䞀時停止し、フォヌカス損倱が䞀時的であるこずを瀺すフラグを保存したす。これにより、AUDIOFOCUS_GAINを凊理するずきに、必芁に応じお再生を再開できたす。 リ゜ヌスを解攟しないでください。

AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK

AUDIOFOCUS_LOSS_TRANSIENTの堎合のようにステヌタスを監芖するこずを忘れないで、ボリュヌムを静かにするか、再生を䞀時停止したす。 リ゜ヌスを解攟しないでください。





結論ず読み物



Androidデバむスのオヌディオアプリケヌションのキャンプで「暡範垂民」になるずいうこずは、オヌディオフォヌカスを操䜜し、すべおの状況を正しく凊理するためのルヌルを尊重するこずを意味したす。 アプリケヌションを合理的な方法で動䜜させ、ナヌザヌに䞍快な驚きを䞎えないようにしおください。 Androidオヌディオサブシステムの詳现に぀いおは、以䞋のリンクを参照しおください。



この蚘事の゜ヌスコヌドは、次の堎所から入手できたす。

https://android.googlesource.com/platform/development/+/master/samples/RandomMusicPlayer



All Articles