ããã¯ãGoogle Developer Relationsã®Kristan Uccelloã«ãããªãŒãã£ãªãã©ãŒã«ã¹ã®å°éã«é¢ããèšäºã®ç¿»èš³ã§ããå ±åäžã«äžæããã®ã¯å€±ç€ŒãšèŠãªãããŸã;ããã¯è©±è
ã«å¯Ÿããç¡ç€Œã瀺ããèŽè¡ãæ©ãŸãã ã¢ããªã±ãŒã·ã§ã³ããªãŒãã£ãªãã©ãŒã«ã¹ãæäœããããã®ã«ãŒã«ãèæ
®ããŠããªãå Žåãä»ã®ã¢ããªã±ãŒã·ã§ã³ãå°éããããŠãŒã¶ãŒãæ©ãŸãããšãæå³ããŸãã
ãªãŒãã£ãªãã©ãŒã«ã¹ã«ã€ããŠèããããšããªãå Žåã¯ã
Androidéçºè
åããã¬ãŒãã³ã°è³æã®ããã¥ã¡ã³ããã芧ãã ããã
è€æ°ã®ã¢ããªã±ãŒã·ã§ã³ããªãŒãã£ãªãåçã§ããå Žåãããããã©ã®ããã«çžäºäœçšããããèããããšãéèŠã§ãã ãã¹ãŠã®ãã¬ãŒã€ãŒãåæã«åçãããç¶æ³ãåé¿ããããã«ãAndroidã¯ãªãŒãã£ãªãã©ãŒã«ã¹ã®æŠå¿µã䜿çšããŠãµãŠã³ãã®åçãå¶åŸ¡ããŸããã¢ããªã±ãŒã·ã§ã³ã¯ããªãŒãã£ãªãã©ãŒã«ã¹ãåãåã£ããšãã«ã®ã¿ãªãŒãã£ãªãåçããå¿
èŠããããŸãã ãã®èšäºã§ã¯ããŠãŒã¶ãŒã®ãªãŒãã£ãªãã©ãŒã«ã¹ç¶æ
ã®å€åãé©åãã€æé©ã«åŠçããããã®ããã€ãã®ãã³ãã«ã€ããŠèª¬æããŸãã
ãªãŒãã£ãªãã©ãŒã«ã¹ãªã¯ãšã¹ã
ã¢ããªã±ãŒã·ã§ã³ã®éå§æã«æ¬²åŒµãã«ãªã£ãŠãªãŒãã£ãªãã©ãŒã«ã¹ãèŠæ±ããå¿
èŠã¯ãããŸããã ã¢ããªã±ãŒã·ã§ã³ããªãŒãã£ãªã¹ããªãŒã ã§äœããéå§ãããŸã§åŸ
ã€æ¹ãè¯ãã§ãããã AudioManagerãµãŒãã¹ãä»ããŠãªãŒãã£ãªãã©ãŒã«ã¹ãåä¿¡ããå Žåã
AUDIOFOCUS_GAIN *宿°ã䜿çšããŠãç®çã®ãã©ãŒã«ã¹ã¢ãŒãã瀺ãããšãã§ããŸãã
ãã©ãŒã«ã¹ãªã¯ãšã¹ãã®äŸAudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); int result = am.requestAudioFocus(mOnAudioFocusChangeListener,
ãã®äŸã§ã¯ãäžå®ã®ãªãŒãã£ãªãã©ãŒã«ã¹ãèŠæ±ããŠããŸãã 代ããã«ãäžæçïŒ
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