开发者控制台

测试音频焦点

测试音频焦点

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

检查音频堆栈的状态

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

adb shell dumpsys audio

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

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

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

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

Audio Focus Requester工具的UI

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

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

使用命令行

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

    支持以下意图操作:

    永久

    指示工具使用FireOS 5和6上的持续时间提示AUDIOFOCUS_GAIN请求音频焦点:

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

    在FireOS 7(Android Oreo及更高版本)上:

    adb shell am start-foreground-service -a "permanent" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
    

    预期行为:

    瞬态

    指示工具使用FireOS 5和6上的持续时间提示AUDIOFOCUS_GAIN_TRANSIENT请求音频焦点:

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

    在FireOS 7(Android Oreo及更高版本)上:

    adb shell am start-foreground-service -a "transient" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
    

    预期行为:

    放弃

    指示工具使用FireOS 5和6上的持续时间提示AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK请求音频焦点:

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

    在FireOS 7(Android Oreo及更高版本)上:

    adb shell am start-foreground-service -a "duck" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
    

    预期行为

    释放

    指示工具放弃FireOS 5和6上的音频焦点:

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

    在FireOS 7(Android Oreo及更高版本)上:

    adb shell am start-foreground-service -a "release" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
    

    预期行为

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