测试音频焦点


测试音频焦点

播放音频的所有应用都应该正确获取和放弃音频焦点,以便与播放的持续时间完全匹配。表现良好的应用符合多媒体应用要求中描述的要求。以下各节介绍了如何评估应用的行为。

检查音频堆栈的状态

您可以通过在 adb 中发出以下命令来检查音频堆栈的当前状态:

adb shell dumpsys audio

返回的输出因安卓版本而异,但重要的部分可能在开头:

Audio Focus stack entries (last is top of stack):
  source:android.os.BinderProxy@e730bd -- pack: com.amazon.avod -- client: com.amazon.media.AmazonAudioManager@c7cb87ecom.amazon.avod.playbackclient.feature.audiofocus.AudioFocusManager$GlobalAudioFocusChangeListener@c521df -- gain: GAIN -- flags:  -- loss: LOSS_TRANSIENT -- uid: 10065 -- attr: AudioAttributes: usage=1 content=2 flags=0x0 tags= bundle=null
  source:android.os.BinderProxy@8089640 -- pack: com.amazon.vizzini -- client: com.amazon.media.AmazonAudioManager@461d1c8com.amazon.vizzini.vim.AudioFocusController@4417261 -- gain: GAIN_TRANSIENT_EXCLUSIVE -- flags:  -- loss: none -- uid: 10112 -- attr: AudioAttributes: usage=1 content=2 flags=0x0 tags= bundle=null
  ...

在此示例中,焦点堆栈中有两个项目;它们通过程序包名称 com.amazon.avodcom.amazon.vizzini 引用应用。最后一个项目具有音频焦点和播放音频的所有权限。列表中的所有其他项目都失去了焦点,但它们一直保留在列表中,直到它们调用 AudioManager.abandonAudioFocus()。这也意味着最后一个项目之上的所有这些应用都已经收到了 OnAudioFocusChangeListener() 回调,因此它们肯定已暂停或静音音频播放。

第二个项目 com.amazon.vizzini 使用持续时间标记 AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE 请求焦点,因此之前位于堆栈顶部的应用收到了带有 TRANSIENT 值的 OnAudioFocusChangeListener() 回调,因此 loss: LOSS_TRANSIENT 值在第一行中列出。

行为良好的应用不会在堆栈中多次列出: 如果您第二次请求音频焦点(例如,播放下一集),您自己的应用将导致您之前的播放实例接收 OnAudioFocusChangeListener() 回调,您仍应通过从第一个实例调用 abandonAudioFocus() 来确认这一点。

同样,一旦完成播放,您应立即释放您的资源并放弃所有焦点请求,以便将您从列表中完全删除。

测试 onAudioFocusChange 回调

以下 Audio Focus Requester 工具允许您在任何应用中执行各种音频焦点更改

通过运行以下命令安装应用:

adb install -t -r audiofocusrequester.apk

可通过两种方法使用该工具:通过其 UI 或通过将命令行与从 adb 发送的意图结合使用。使用 UI 更简单 — 您可以使用下拉框配置所有参数。命令行不允许您选择全部参数(例如流类型),但可以准确确定焦点更改的时间,因为它们在您发送意图时发生。

使用 UI

通过下拉框,您可以选择安卓文档中描述的所有音频焦点请求参数。当然,当音频焦点被带走时,正在接受测试的应用应该在前台播放媒体,因此您也可以微调两个额外的超时:一个是工具请求焦点之前的等待时间,一个是焦点返回到您的应用之前的等待时间。

通过这种方式,您可以选择要测试的用例,启动第一个计时器,导航到应用并开始播放。当第一个超时过期时,工具将请求焦点。然后,第二个超时开始等待焦点返回到您的应用。

Audio Focus Requester 工具的 UI

要将 Audio Focus Requester UI 与您的应用结合使用,请执行以下操作:

  1. 在设备上安装目标应用和 Audio Focus Requester 工具。
  2. 启动 Audio Focus Requester 工具。
  3. 选择焦点请求和超时的参数。
  4. 单击完成设置并启动计时器,然后确认您要启动计时器。
  5. 导航到您的应用并开始播放。
  6. 等待超时结束。

使用命令行

  1. 同时安装目标应用和音频焦点工具。
  2. 在应用中开始播放。
  3. 使用意图指示服务 com.amazon.audiofocusrequester/.AudioFocusRequesterService 请求和放弃音频焦点。

    支持以下意图操作:

    永久

    指示工具使用持续时间提示 AUDIOFOCUS_GAIN 请求音频焦点:

    adb shell am startservice -a "permanent" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
    

    预期行为:

    瞬态

    指示工具使用持续时间提示 AUDIOFOCUS_GAIN_TRANSIENT 请求音频焦点:

    adb shell am startservice -a "transient" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
    

    预期行为:

    放弃

    指示工具使用持续时间提示 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 请求音频焦点:

    adb shell am startservice -a "duck" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
    

    预期行为

    释放

    指示工具放弃音频焦点:

    adb shell am startservice -a "release" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
    

    预期行为

所有应用的行为都应符合 Fire TV 上多媒体应用的要求中描述的要求。如果您遇到任何问题,请重新检查您的 onAudioFocusChange() 回调的实现。