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

如何为API级别20以上的Android设备请求AudioFocus?

施宏大
2023-03-14

我使用这个文档中提到的AudioManager类实现了这个调用:https://developer . Android . com/guide/topics/media-apps/audio-focus。当我呼叫时,我可以看到音频管理器资源被占用:

audioManager.requestAudioFocus(audioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

但是音频管理器资源不会通过调用:

audioManager.abandonAudioFocus(audioFocusChangeListener);

此外,如上面共享的文档中提到的:

对于面向Android 5.0 (API级别21)和更高版本的应用程序,音频应用程序应该使用AudioAttributes来描述应用程序正在播放的音频类型。比如播放语音的app要指定CONTENT_TYPE_SPEECH。

但是在AudioManager类函数中,使用AudioAttributes调用的函数被标记为下面提到的SystemApi:

@SystemApi
    @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
    public int requestAudioFocus(OnAudioFocusChangeListener l,
            @NonNull AudioAttributes requestAttributes,
            int durationHint,
            int flags)

那么,api级别20(Android L)之间的设备应该调用哪个函数

共有1个答案

卫建义
2023-03-14

音频管理器资源未被释放

那是什么意思?你怎么知道?

a)如果您请求< code>AUDIOFOCUS_GAIN,然后放弃它,则会出现静默。

例如,我正在听应用程序A中的音乐,然后我开始听应用程序B中的音乐并暂停。应用程序A不会自动开始播放,这很好。这就是与瞬时聚焦的区别。

  • 当您计划在可预见的未来播放音频(例如,播放音乐时),并且您希望音频焦点的前持有者停止播放时,请请求永久音频焦点(AUDIOFOCUS_GAIN

b)当您放弃焦点时,您有责任停止播放。

如果您放弃对焦并继续播放,您将不再参与音频对焦机制。如果我启动了你的应用以外的其他音乐播放器,则当我的其他音乐播放器请求音频焦点时,系统将无法停止你的应用的播放。

播放完毕后,调用< code>abandonAudioFocus()。

来源:Android 8.0之前的Audio focus

应为设备调用哪个函数 [L-O]

< code>AudioManager中唯一可用的。Audio focus pre-Android 8.0中提到的STREAM_*常量。

// Request audio focus for playback
val result: Int = audioManager.requestAudioFocus(
    afChangeListener,
    // Use the music stream.
    AudioManager.STREAM_MUSIC, // There's no AudioAttributes, just the more general constant.
    // Request permanent focus.
    AudioManager.AUDIOFOCUS_GAIN
)

对于面向 Android 5.0(API 级别 21)及更高版本的应用,音频应用应使用 AudioAttributes 来描述您的应用正在播放的音频类型。

您提到的引用不是关于<code>requestAudioFocus</code>调用的,而是关于<code>setAudioAttributes</code>的,它可在<code>MediaPlayer</code>、<code>SoundPool上找到。生成器,以及所有其他播放声音的东西。

 类似资料:
  • 我们可以使用哪个Android API来设置我的平板电脑上的音量级别,以便在插入耳机时播放音调。目前我使用以下API,当耳机插入时似乎不起作用。 我做了以下设置,以便在耳机插入时通过扬声器路由音频(这是我的应用程序的要求)< code > audio manager . set mode(audio manager。模式_通话中); < code > audio manager . setspea

  • 我有一个android应用程序,其中使用了第三方jar。Http请求是在应用程序运行时从第三方jar发送到服务器的。我需要捕获从第三方JAR发送的HTTP请求。我想知道是否有一个简单的方法来实现非根设备 启动:我试过下载“ProxyDroid”,但它需要根手机我也试过用“Shark Reader”下载“Shark for Root”,它也需要根设备我试过很多其他应用程序,它们可以捕获完整的请求,但

  • 我有搭载Android7.1.1的中兴Axon 7 但是我不能执行“即时运行”--在菜单运行中,我看到应用更改:目标设备API级别(API1)太低,无法即时运行

  • 我在Crashlytics上得到了这份坠机报告: 我看过这篇文章,但我不能在我的自定义课上做。 我怎样才能解决这个问题? StackTrace:

  • 现在与android 10更新的权限和安全性,我们不能访问用户的设备ID和IMEI号码,但我想要一些设备的唯一ID,以便我们可以跟踪用户。 要求是我们想要/限制一部手机的一次登录

  • 有人知道我如何预测android设备上的下一个id吗。因为每次我翻阅阅读器,我都会得到一个不同的id。