Android 在单击按钮时将呼叫切换到扬声器

问题描述 投票:0回答:1

我正在创建一个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" /> 
android
1个回答
0
投票

嗯,你错过了很多东西,例如电信框架

setSpeakerphoneOn
弃用(目前文档说在API34+中弃用,但事实并非如此!当引入
setCommunicationDevice
时它停止工作,因此API 31+)

如果您要拨打“正式”电话(假设是因为

MANAGE_OWN_CALLS
),那么您将通过
setAudioRoute
(其值例如
CallAudioState.ROUTE_SPEAKER
)在听筒/扬声器之间切换

如果您没有拨打“正式”电话,只是播放音频,那么您不应该设置

setMode
setSpeakerPhone
(或
setCommunicationDevice
)应该可以工作

您可能会在这里

我的相关SO问题中找到一些有用的代码
© www.soinside.com 2019 - 2024. All rights reserved.