当前位置: 首页 > 知识库问答 >
问题:

audio manager . request audio关注Lollipop及更高版本

尉迟明辉
2023-03-14

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

对于以Android 5.0(API级别21)及更高版本为目标的应用程序,音频应用程序应使用音频属性来描述您的应用程序正在播放的音频类型。例如,播放语音的应用程序应指定CONTENT_TYPE_SPEECH。源

但是我从哪里开始,我需要什么来达到与kitkat和oreo相同的结果?(AudioFocusRequest。API 21到API 26还没有Builder()。)

这是我的代码片段:

/** 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()
    }
}

共有1个答案

邓德本
2023-03-14
    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);
    }
 类似资料:
  • 我在AndroidLollipop和更高版本中录制语音通话时遇到问题。通过此代码,我能够录制我的声音,但无法录制其他人的声音。 此代码在androidLollipop版本下运行良好。请帮我解决这个问题

  • 问题内容: 网页中Java Applets的一个众所周知的问题是,浏览器会忽略applet标记的z-index而不是页面中的其他组件。无论您如何在页面中定位元素和z- index元素,小程序都将在所有内容之上吸引自己。 有一种解决方法,称为iframe垫片,如此处所述:http : //www.oratransplant.nl/2007/10/26/using-iframe-shim-to-par

  • 我正在使用pullToRefresh库: 但是如果android版本大于4.0,列表无法移动。 LogCat显示模拟器警告,但它们不相关。 如何解决移动列表的问题?

  • 我有一个在eclipse上运行的项目,但当我制作“java-jar”时,它会出现以下错误: 当我制作“java-version”时,输出是: 我做错了什么?

  • 问题内容: 我对Java Web Start的状态感到困惑。在Oracle的支持路线图中,我们可以阅读以下内容: 部署技术支持 由Java插件和Web Start技术组成的Web部署技术具有较短的支持生命周期。对于通过Java SE 8进行的主要发行,Oracle为这些技术提供了五(5)年的高级支持。扩展支持不适用于部署堆栈,并且不适用于Java SE 9以外的支持。有关详细信息,请参见Oracl

  • 如果我有一个用SwiftUI制作的应用程序,它是否适用于iOS13以下的iOS?