为何我看来电时音频默认是听筒,但是会自动设置成扬声器?

nicklee 3月前 285

上图是你们demo的日志,AVAudioManager 日志说明开始默认是听筒,但是后面触发两次设置模式,。,最后设置成扬声器,我并没有点击界面的扬声器操作,该如何设置默认是听筒呢?

最新回复 (8)
  • x86 3月前
    引用 2
    你说的 android-chat 项目,还是 uni-chat 项目?

    android-chat 项目,我们测试确认了:音频通话的时候,默认就是听筒的
  • nicklee 3月前
    引用 3
    x86 你说的 android-chat 项目,还是 uni-chat 项目? android-chat 项目,我们测试确认了:音频通话的时候,默认就是听筒的
    你们 github是最新的代码吗?我拉下的跑起来就是这样的,没有任何改动,接收者方的扬声器按钮没有选择,但是声音是扬声器的。,你看日志可以看到 AVAudioManager会调用 setAudioDeviceInternal 函数 
  • x86 3月前
    引用 4
    我们更新了,请用最新代码测试一下。
  • nicklee 3月前
    引用 5

    我拉过新代码了, 由于我UI的状态取的是 didAudioDeviceChanged函数的回调的值,所有会有bug. 虽然你们demo跑起来时 ui的扬声器按钮状对上了(都是扬声器)。但是 如果我在reciveCall 函数中给这个callsession 设置 callback ,在收到来电时,会立刻触发一次 didAudioDeviceChanged 函数, 此时默认是听筒,然后你们 的AvAudioManager 类会设置 为扬声器,设置成功后,不会再次触发 didAudioDeviceChanged函数,

        public void onReceiveCall(AVEngineKit.CallSession session) {
    
            ChatManager.Instance().getMainHandler().postDelayed(() -> {
                AVEngineKit.CallSession callSession = AVEngineKit.Instance().getCurrentSession();
                if (callSession == null || callSession.getState() == AVEngineKit.CallState.Idle) {
                    return;
                }
    //            callSession.setVideoCapturer(new UVCCameraCapturer());
    
                List<String> participants = callSession.getParticipantIds();
                if (participants == null || participants.isEmpty()) {
                    return;
                }
    
                Conversation conversation = callSession.getConversation();
                if (conversation == null) {
                    return;
                }
                if (conversation.type == Conversation.ConversationType.Single) {
                    //Intent intent = new Intent(WfcIntent.ACTION_VOIP_SINGLE);
                    Intent intent = new Intent(application, SingleCallActivity.class);
                    startActivity(application, intent);
                } else {
                    //Intent intent = new Intent(WfcIntent.ACTION_VOIP_MULTI);
                    Intent intent = new Intent(application, MultiCallActivity.class);
                    startActivity(application, intent);
                }
                VoipCallService.start(application, false);
                if (avEngineCallback != null) {
                    avEngineCallback.onReceiveCall(AVEngineKit.Instance().getCurrentSession());
                }
            }, 200);
        }
    

    上面你们原来的代码会少收到这一次的 didAudioDeviceChanged, 如果在收到 onReceiveCall 的时候立刻给这个session这个callback,就会出现我的问题,

        @Override
        public void onReceiveCall(AVEngineKit.CallSession session) {
            Log.d(TAG, "onReceiveCall: ");
            session.setCallback(new AVEngineKit.CallSessionCallback() {
            //省略代码
    }
    //省略代码,无改动
    }
  • x86 3月前
    引用 6
    你更新 avenginekit.aar 了吗?这里面修复了 didAudioDeviceChanged 回调的问题
  • nicklee 3月前
    引用 7

    更了的,我是新拉的你们github代码,然后在 onReceiveCall 这个函数里,直接用参数的CallSession 设置callback,然后就是我上述的情况了。didAudioDeviceChanged 在开始的时候会回调一次 输出设备为 听筒,然后你们的AVAudioManager类设置 为扬声器时,这个回调不会触发,所以我用didAudioDeviceChanged 这里面的值来给UI设置选择就会对不上。

  • nicklee 3月前
    引用 8
    AVAudioManager 在接通电话的时候会设置为扬声器,应该你们内部设的,我没有调用操作,
  • x86 3月前
    引用 9
    请你微信添加下 wfchat ,他了解下情况
返回