å ±åäžã«äžæããã®ã¯å€±ç€ŒãšèŠãªãããŸã;ããã¯è©±è ã«å¯Ÿããç¡ç€Œã瀺ããèŽè¡ãæ©ãŸãã ã¢ããªã±ãŒã·ã§ã³ããªãŒãã£ãªãã©ãŒã«ã¹ãæäœããããã®ã«ãŒã«ãèæ ®ããŠããªãå Žåãä»ã®ã¢ããªã±ãŒã·ã§ã³ãå°éããããŠãŒã¶ãŒãæ©ãŸãããšãæå³ããŸãã ãªãŒãã£ãªãã©ãŒã«ã¹ã«ã€ããŠèããããšããªãå Žåã¯ã 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 ã ãªãŒãã£ãªã¹ããªãŒã ã®çš®é¡ã
çš®é¡
| 説æ
|
STREAM_ALARM
| ç®èŠãŸãæèš
|
STREAM_DTMF
| ããŒã³ãã€ã€ã«
|
STREAM_MUSIC
| ãã«ãã¡ãã£ã¢ã®åçïŒé³æ¥œãããããã£ã¹ãããããªïŒ
|
STREAM_NOTIFICATION
| éç¥
|
STREAM_RING
| é»è©±
|
STREAM_SYSTEM
| ã·ã¹ãã é³
|
泚ïŒé»è©±ã§ã®äŒè©±ãçºçããå Žåãã·ã¹ãã ã¯ãªãŒãã£ãªãã©ãŒã«ã¹ïŒ 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ãªãŒãã£ãªãµãã·ã¹ãã ã®è©³çŽ°ã«ã€ããŠã¯ã以äžã®ãªã³ã¯ãåç §ããŠãã ããã
- Androidéçºè åããªãœãŒã¹ã®ã¬ãã¹ã³ã Audio Focusã®ç®¡ç ã
- ã¢ããªã±ãŒã·ã§ã³ããäºãã«ããŸããã¬ã€ã§ããããã«ããïŒãªã¢ãŒãã³ã³ãããŒã«ãã¿ã³ã®åŠç ãAndroidããããããŒããã°ã®ããã°æçš¿ã
ãã®èšäºã®ãœãŒã¹ã³ãŒãã¯ã次ã®å Žæããå ¥æã§ããŸãã
https://android.googlesource.com/platform/development/+/master/samples/RandomMusicPlayer