Managing Audio Playback之Managing Audio Focus

    xiaoxiao2026-06-07  3

    同一时间可能要好多个app在播放audio,Android用audio focus 来避免app之前互相影响.只有持有audio focus的app才可以播放audio. 可以用requestAudioFocus()来获取对应audio stream的audio focus.如果返回值是AUDIOFOCUS_REQUEST_GRANTED的话,即说明成功获得audio focus. AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); // Request audio focus for playback int result = am.requestAudioFocus(afChangeListener,                                  // Use the music stream.                                  AudioManager.STREAM_MUSIC,                                  // Request permanent focus.                                  AudioManager.AUDIOFOCUS_GAIN); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {     am.registerMediaButtonEventReceiver(RemoteControlReceiver);     // Start playback. } 当播放完成时,应该调用abandonAudioFocus()来告诉系统不再需要focus,其参数是AudioManager。OnAudioFocusChangeListner(). // Abandon audio focus when playback complete am.abandonAudioFocus(afChangeListener); 可以通过下面的code来获得短暂的focus,和上面的差别在requestAudioFocus的第三个参数为AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK。 / Request audio focus for playback int result = am.requestAudioFocus(afChangeListener,                              // Use the music stream.                              AudioManager.STREAM_MUSIC,                              // Request permanent focus.                              AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {     // Start playback. } 在OnAudioFocusChangeListener 中我们可以检测audio focus的loss/gain 等事件. AudioManager.OnAudioFocusChangeListener afChangeListener =     new AudioManager.OnAudioFocusChangeListener() {         public void onAudioFocusChange(int focusChange) {             if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT) {                 // Pause playback             } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {                 // Resume playback             } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {                 am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);                 am.abandonAudioFocus(afChangeListener);                 // Stop playback             }         }     }; 当发生duck是,需要降低音量. OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {     public void onAudioFocusChange(int focusChange) {         if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {             // Lower the volume         } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {             // Raise it back to normal         }     } };
    转载请注明原文地址: https://ju.6miu.com/read-1310271.html
    最新回复(0)