测试音频焦点
播放音频的所有应用都应该正确获取和放弃音频焦点,以便与播放的持续时间完全匹配。表现良好的应用符合多媒体应用要求中描述的要求。以下各节介绍了如何评估应用的行为。
检查音频堆栈的状态
您可以在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.avod
和com.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工具。
- 启动Audio Focus Requester工具。
- 选择焦点请求和超时的参数。
- 单击Finish setup and start timers(完成设置并启动计时器),然后确认您要启动计时器。
- 导航到您的应用并开始播放。
- 等待超时结束。
使用命令行
- 同时安装目标应用和音频焦点工具。
- 在应用中开始播放。
-
使用意图指示服务
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()
回调实施。