我正在创建一个Android应用程序,它可以进行音频/视频通话(如whatsapp)。每当接到/拨打电话时,用户可以单击按钮将声音从低音扬声器切换到扬声器。
在 onViewCreated() (我在片段中进行呼叫)函数中,我首先检查呼叫是视频还是音频,然后相应地切换扬声器
AudioManager audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(!mAudioOnly);
mToggleSpeakerphoneBtn.setImageResource(mAudioOnly ? R.drawable.ic_volume_off : R.drawable.ic_volume_up); //Set icon to turn on/off speaker
然后我有一个 onclick 监听器,用于将其切换回来,如下所示:
mToggleSpeakerphoneBtn.setOnClickListener(v0 ->
toggleSpeakerphone((FloatingActionButton) v0));
使用切换扬声器如下:
private void toggleSpeakerphone(FloatingActionButton b) {
AudioManager audioManager = (AudioManager) b.getContext().getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
boolean enabled = audioManager.isSpeakerphoneOn();
audioManager.setSpeakerphoneOn(!enabled);
b.setImageResource(enabled ? R.drawable.ic_volume_off : R.drawable.ic_volume_up);
}
}
当我收到音频呼叫时,问题就出现了,语音正确地从耳机中发出。当我尝试切换扬声器时,图标会发生变化,就好像扬声器处于活动状态一样(情况并非如此,声音总是来自耳机),并且在其余时间尝试“停用”扬声器(已经不运行)失败作为audioManager.isSpeakerphoneOn();总是假的。
我错过了什么?
Manifest 具有以下权限:
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
嗯,你错过了很多东西,例如电信框架或
setSpeakerphoneOn
弃用(目前文档说在API34+中弃用,但事实并非如此!当引入setCommunicationDevice
时它停止工作,因此API 31+)
如果您要拨打“正式”电话(假设是因为
MANAGE_OWN_CALLS
),那么您将通过 setAudioRoute
(其值例如 CallAudioState.ROUTE_SPEAKER
)在听筒/扬声器之间切换
如果您没有拨打“正式”电话,只是播放音频,那么您不应该设置
setMode
和 setSpeakerPhone
(或 setCommunicationDevice
)应该可以工作
您可能会在这里
我的相关SO问题中找到一些有用的代码