Android AudioManager.RequestAudio专注于棒棒糖和更高版本

Android AudioManager.RequestAudio专注于棒棒糖和更高版本,android,android-mediaplayer,android-audiomanager,Android,Android Mediaplayer,Android Audiomanager,我目前正在为一个培训应用程序实现一个AudioHelper,它可以在您的培训期间运行一些激励性演讲。因此,基本上,如果演讲正在进行,我想避开我的spotify音频,以便清晰地听到演讲。对于Kitkat和Oreo(以及更高版本),我已经实现了这一点(请参见代码)。但是对于棒棒糖,我找不到正确的实现。在developer.android.com上,他们写道: 对于针对Android 5.0(API级别21)及更高版本的应用程序,音频应用程序应使用AudioAttributes来描述应用程序正在播放的

我目前正在为一个培训应用程序实现一个AudioHelper,它可以在您的培训期间运行一些激励性演讲。因此,基本上,如果演讲正在进行,我想避开我的spotify音频,以便清晰地听到演讲。对于Kitkat和Oreo(以及更高版本),我已经实现了这一点(请参见代码)。但是对于棒棒糖,我找不到正确的实现。在developer.android.com上,他们写道:

对于针对Android 5.0(API级别21)及更高版本的应用程序,音频应用程序应使用AudioAttributes来描述应用程序正在播放的音频类型。例如,播放语音的应用程序应该指定内容\类型\语音

但是我从哪里开始,我需要什么来达到kitkat和oreo的相同效果?(直到API 26,AudioFocusRequest.Builder()才可用于API 21。)

以下是我的代码片段:

/** Apps running Android 8.0 (API level 26) or greater should use the requestAudioFocus() method,
 * which takes an AudioFocusRequest parameter. The AudioFocusRequest contains information about
 * the audio context and capabilities of your app. The system uses this information to manage
 * the gain and loss of audio focus automatically.
 */
@RequiresApi(Build.VERSION_CODES.O)
private fun loadAndPlayAudioForOreoAndHigher() {
    val audioAttributes = AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_NOTIFICATION)
            .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
            .build()

    val audioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK).run {
        setAudioAttributes(audioAttributes)
        setAcceptsDelayedFocusGain(true)
        setOnAudioFocusChangeListener(MediaHelper)
        build()
    }

    val focusRequest = audioManager.requestAudioFocus(audioFocusRequest)
    if(focusRequest == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        mediaPlayer.setOnCompletionListener { audioManager.abandonAudioFocusRequest(audioFocusRequest) }
        mediaPlayer.start()
    }
}

/**
 * For apps that target Android 5.0 (API level 21) and later, audio apps should use
 * AudioAttributes to describe the type of audio your app is playing. For example,
 * apps that play speech should specify CONTENT_TYPE_SPEECH.
 */
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
private fun loadAndPlayAudioForLollipopAndHigher() {
    // TODO implement audioFocusRequest() and abandonAudioFocusRequest()
}

/**
 * Beginning with Android 2.2 (API level 8), apps manage audio focus by calling
 * requestAudioFocus() and abandonAudioFocus(). Apps must also register an
 * AudioManager.OnAudioFocusChangeListener with both calls in order to receive callbacks
 * and manage their own audio level.
 */
@Suppress("DEPRECATION")
@RequiresApi(Build.VERSION_CODES.KITKAT)
private fun loadAndPlayAudioForKitkatAndHigher() {
    val focusRequestResult = audioManager.requestAudioFocus(this, AudioManager.STREAM_NOTIFICATION, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK)
    if(focusRequestResult == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        mediaPlayer.setOnCompletionListener { audioManager.abandonAudioFocus(this) }
        mediaPlayer.start()
    }
}

您可以尝试
setAudioAttributes
方法
Mediaplayer
问题是针对针对Android 5.0(API级别21)的应用程序,如中所述,我们必须使用AudioAttributes来描述您的应用程序正在播放的音频类型,但没有使用AudioAttributes向请求焦点公开的API。
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        videoView.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE);
    } else {
        AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
        audioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
    }