小米开发平台Audio接口使用规范

小米开发平台Audio接口使用规范

1. 关于setSpeakerphoneOn方面的使用

问题描述:

在MIUI的项目开发过程中,经常收到用户反馈通话声音会自动外放,经分析排查发现均是第三方应用在通话期间调用了setSpeakerphoneOn(true)方法引起的,影响用户正常通话。

建议:

音频类应用可以利用AudioFocus机制或者监听电话状态来进行控制处理,在手机通话期间不要调用setSpeakerphoneOn方法,从而避免对正常通话的影响。

2. 关于setMode的使用

问题描述:

当前很多APP,多见于社交或需要队友语音的游戏。使用这个接口来设置手机通话模式,改变手机声音的输出设备。当电话模式处于“AudioManager.MODE_IN_COMMUNICATION”或“AudioManager.MODE_IN_CALL”时,声音会默认从听筒发声。且用户默认音量调节类型会变为通话音量类型。

建议:

开发过程中,setMode(AudioManager.MODE_IN_COMMUNICATION)和setMode(AudioManager.MODE_NORMAL)务必成对使用。需要考虑应用异常的情况下,也能够将电话模式重置为normal状态。

3. 关于getStreamVolume的使用

使用建议:

通过该方法得到的音量值受多方因素影响。需要充分考虑当前设备的audiopolicy route策略,选中不同的设备,得到的音量值也不一样。此外该方法受静音模式影响,如果手机处于静音状态,无论音量值为多少,得到的index均为0。如果需要不想受静音状态影响,建议使用getLastAudibleStreamVolume。

4. setStreamVolume音量设置会导致媒体音退出静音状态

问题描述:

  • MIUI允许用户在静音开启时静止媒体音。但静止状态时,一旦触发音量增操作,媒体音会立刻退出静音状态。有许多视频播放或直播app,会在退出app时保存当前音量值,重开app时将音量值restore。这个操作经常会错误的将用户的静音状态解除。
  • app会catch按键时间,调用setStreamVolume来控制媒体音量。某些情况会导致音量调节异常。

建议:

  • 当应用返回时,通过isStreamMute或getRingerMode方法获取手机当前状态,如果处于媒体音或者铃声状态处于静音,则不执行setStreamVolume操作。
  • 音量的控制尽可能的交由系统处理,少用setStreamVolume设置音量。

音频类AudioManager接口使用规范

一、setRingerMode错误使用会使得与铃声相关音频全部被静音

问题描述:

某些APP会调用该接口实现静音铃声播放或将手机切换为振铃模式的功能,用户在使用此类APP进行上述两种操作中任意一种后,会导致手机系统中所有与铃声相关音频都会被静音,用户接收不到铃声、手机提示音等,严重影响用户使用体验。

建议:

非声音设置类型的应用不调用setRingerMode接口,交由手机系统控制。

二、setSpeakerphoneOn可能会导致语音和通话被强制从扬声器输出

问题描述:

语音社交类APP为满足用户语音外放的需求,会调用此接口,但若未在播放结束后,将该接口参数设置为false,会导致之后语音和通话音频流会一直被强制从扬声器输出,影响用户使用其他APP。

建议:

一旦APP调用了setSpeakerphoneOn(此时参数为true),在播放音频流结束后,需要设置setSpeakerphoneOn参数为false,把音频通路还原。

三、setStreamMute这个接口即将废除,建议使用其他接口

问题描述:

该接口会使得用户在使用APP时,静音了某个音频流后,手机中已安装的其他APP,其相应类型的音频流都会被设置为静音。

建议:

setStreamMute接口即将被废除,建议开发者使用相应音频实例对应的调节音量参数来实现静音APP自身播放的音频流的功能,例如:AudioTrack实例中的setVolume;MediaPlayer实例中的setVolume;mPlayer.setVolume(0)。

四、setStreamVolume设置错误的音频流类型,会使用户无法正常调节手机音量

问题描述:

在不同的使用场景,用户会有调节不同音频流音量的需求,APP可以调用接口setStreamVolume(int streamType, int index, int flags)来满足这一需求,但往往开发者并没有将streamType参数与当前场景正在播放的音频流类型设置一致,并且该接口可以截获系统的音量按键,导致用户使用APP时,按音量键调节音量后,当前的声音音量大小却没有变化。

建议:

(1)当前vivo手机系统已经可以实现智能识别用户调节音量的场景,并且精准定位用户需要调节的音频流类型,因此建议音量按键交由手机系统来控制。

(2)如若开发者需要调节特定音量,要使用setStreamVolume接口,请设置好符合用户需求场景的正确音频流类型。

五、如若错误使用setMode,会导致音频输出到错误的设备上

问题描述:

当前很多APP(常见于社交类)使用这个接口来设置手机通话模式,改变手机声音的输出设备。用户在使用APP时,使用“语音通话模式”(AudioManager.MODE_IN_COMMUNICATION)后,手机会默认从听筒输出音频,导致用户听不见手机提示音、来电铃声等音频。

建议:

开发过程中,需要注意在播放音频流结束后,调用接口setMode (AudioManager. MODE_NORMAL),把手机模式还原为正常模式。

六、setBluetoothScoOn使用不当,会导致蓝牙无声音输出

问题描述:

当用户需要声音从蓝牙输出时,某些APP会使用蓝牙Sco-link通路来传送语音数据到蓝牙耳机。如果开发者没有使用startBluetoothSco成功建立 sco-link连接通路后就直接调用setBluetoothScoOn(true

),会使得蓝牙耳机无声音输出。

建议:

开发者应使用startBluetoothSco和stopBluetoothSco接口来建立/断开sco-link连接通路,在建立sco-link连接后,有场景需要将音频从蓝牙切换到手机上时候,调用setBluetoothScoOn(false),再次将音频切换回蓝牙播放时,使用setBluetoothScoOn(true)。

七、setMicrophoneMute没有配对使用,可能导致手机录音或语音发送功能失效

问题描述:

某些社交/直播类APP会调用该接口实现语音静音发送的功能,但有些开发者在APP退出的时候没有设置接口为unmute,导致后续其他APP使用手机麦克风录制出来的音频都是静音状态的,影响用户的使用。

建议:

由于这个接口直接作用在手机的底层麦克风数据通路,影响范围很大,不建议使用这个接口来实现语音静音发送的需求。开发者可以通过将APP获取到的音频数据直接替换为值=0(静音)的方式,或采取把录制上来的数据直接丢弃不处理的方式来实现这种需求。