How to set Audio Focus ChangeListener in Android API O?

前端 未结 2 1649
悲&欢浪女
悲&欢浪女 2021-02-15 20:30

Since requestAudioFocus(AudioManager.OnAudioFocusChangeListener l, int streamType, int durationHint) is deprecated in API O , how do you set audio focus change list

相关标签:
2条回答
  • 2021-02-15 20:49

    Another option is to use AudiomanagerCompat together with AudioAttributesCompat and AudioRequestCompat, all part of Jetpack (androidx) compatibility libraries: https://developer.android.com/reference/androidx/media/AudioManagerCompat

    In this way, you can use the same code for Android O+ and also for previous versions (without conditional checks on the API version. But one of the drawbacks of this approach is that you can't use: .setAcceptsDelayedFocusGain(true)

    If you decide for this approach, then you have to use requestAudioFocus(mAudioManager, mFocusRequest) and abandonAudioFocusRequest(mAudioManager, mFocusRequest) to obtain and release audio focus.

    Partial sample code (in Kotlin): (Note: if you do not use Timber for logging, replace it by the standard Log function)

    class MyClass : AudioManager.OnAudioFocusChangeListener {
    
        internal var audioManager: AudioManager? = null
        private var focusRequest: AudioFocusRequestCompat? = null
        private var playbackAttributes : AudioAttributesCompat? = null
    
        // Create AudioManager and other audio related objects
        audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager?
        playbackAttributes = AudioAttributesCompat.Builder()
                    .setUsage(AudioAttributesCompat.USAGE_MEDIA)
                    .setContentType(AudioAttributesCompat.CONTENT_TYPE_SPEECH)
                    .build()
    
        focusRequest = AudioFocusRequestCompat.Builder(AudioManagerCompat.AUDIOFOCUS_GAIN)
                    .setAudioAttributes(playbackAttributes ?: return)
                    .setWillPauseWhenDucked(false)
                    .setOnAudioFocusChangeListener(this)
                    .build()
    
        // Request audio focus and check if it was granted to us
        if (requestAudioFocus(audioManager!!, focusRequest!!) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
             // We obtained audio focus
    
        }
        else {
            // We could not obtain audio focus
    
        }
    
        // And to remove audio focus
        if (audioManager != null && focusRequest != null)
                abandonAudioFocusRequest(audioManager!!, focusRequest!!)
    
    
    
        // Implementation of OnAudioFocusChangeListener
        override fun onAudioFocusChange(focusState: Int) {
    
            // Invoked when the audio focus of the system is updated.
            when (focusState) {
                AudioManager.AUDIOFOCUS_GAIN -> {
                    // We recovered audio focus.
                    Timber.d("Audio Focus obtained")
                }
                AudioManager.AUDIOFOCUS_LOSS -> {
                    // Lost focus for an unbounded amount of time
                    Timber.d("Audio Focus lost")
                }
                AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
                    // Lost focus for a short time, but it's ok to keep playing at an attenuated level
                    Timber.d("Audio Focus transient loss - can duck")
                }
                AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
                    // Lost focus for a short time
                    Timber.d("Audio Focus transient loss - cannot duck")
                }
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-15 20:53

    https://developer.android.com/guide/topics/media-apps/audio-focusOfficial Link for the resource

     AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mAudioManager.requestAudioFocus(new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
                    .setAudioAttributes(
                            new AudioAttributes.Builder()
                                    .setUsage(AudioAttributes.USAGE_GAME)
                                    .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                                    .build()
                    )
                    .setAcceptsDelayedFocusGain(true)
                    .setOnAudioFocusChangeListener(new AudioManager.OnAudioFocusChangeListener() {
                        @Override
                        public void onAudioFocusChange(int focusChange) {
                           //Handle Focus Change 
                        }
                    }).build()
            );
        } else {
    
            mAudioManager.requestAudioFocus(focusChange -> {
    
                       //Handle Focus Change for earliest version of oreo
                    },
                    AudioManager.STREAM_MUSIC,
                    AudioManager.AUDIOFOCUS_GAIN);
        }
    
    0 讨论(0)
提交回复
热议问题