拨打电话通过蓝牙接通

news/2024/11/2 15:31:16/

我配对号蓝牙耳机,然后拨打电话,接通后,声音会从蓝牙耳机里面出来,这个流程是怎么样的呢?今天就来分析。

     首先肯定的是在开启蓝牙通话的这个通道是在Phone进程里面。

     APP层核文件:

    BluetoothHandsfree.java

接通开通蓝牙的通话通道不是在Incscreen,而是在这个BluetoothHandsfree内部类BluetoothPhoneState类里面注册了一个广播的监听器来监听电话的状态:

代码片段:

 case PRECISE_CALL_STATE_CHANGED:
                case PHONE_CDMA_CALL_WAITING:
                    Connection connection = null;
                    if (((AsyncResult) msg.obj).result instanceof Connection) {
                        connection = (Connection) ((AsyncResult) msg.obj).result;
                    }

                    handlePreciseCallStateChange(sendUpdate(), connection);

当Phone处于Dialing状态的时候就会去建立连接。

流程:handlePreciseCallStateChange---->audioOn();--->mHeadset.connect()   (mHeadset在原生态代码中为BluetoothAudioGateway,在MTK平台中为HeadsetBase,但实现的效果都一样)

Framework:

(BluetoothAudioGateway或则BluetoothAudioGateway)connect--->connectNative()---->connectNative()(android_bluetooth_BluetoothAudioGateway)----->


当系统建立连接后就会通过BluetoothHeadsetService来通知BluetoothAudioGateway进行出里。

BluetoothHeadsetService中的代码片段:

 case BluetoothAudioGateway.SCO_ACCEPTED:
                    case BluetoothAudioGateway.SCO_CONNECTED:
                    case BluetoothAudioGateway.SCO_CLOSED:
                        if(msg.obj == null) {
                            logWarn("Remote Device is null when receive SCO msg");
                            mBtHandsfree.handleSCOEvent(msg.what, null);


BluetoothAudioGateway:

 handleSCOEvent--->mAudioManager.setBluetoothScoOn(true);---->AudioManager----->AudioService

AudioService:

setBluetoothScoOn代码片段:

public void setBluetoothScoOn(boolean on){
        if (!checkAudioSettingsPermission("setBluetoothScoOn()")) {
            return;
        }
        mForcedUseForComm = on ? AudioSystem.FORCE_BT_SCO : AudioSystem.FORCE_NONE;

        sendMsg(mAudioHandler, MSG_SET_FORCE_USE, SHARED_MSG, SENDMSG_QUEUE,
                AudioSystem.FOR_COMMUNICATION, mForcedUseForComm, null, 0);
        sendMsg(mAudioHandler, MSG_SET_FORCE_USE, SHARED_MSG, SENDMSG_QUEUE,
                AudioSystem.FOR_RECORD, mForcedUseForComm, null, 0);
        Log.d(TAG, "setBluetoothScoOn " + mForcedUseForComm);
    }

注意这里发送了两次消息。猜测两次的目的是一次是告诉系统我要使用的是通话功能,二次是告诉系统录音功能,因为通话的时候应该是可以录音的,如果把第二次For_RECORD去掉,应该是也能成功设置的。

setForceUse---> AudioSystem.setForceUse------>AudioSystem::setForceUse-------->AudioPolicyService::setForceUse------->AudioYusuPolicyManager::setForceUse

AudioYusuPolicyManager:

这里面有个很重要的位置判断:

if(AudioSystem::popCount(newDevice) != 2 )
    {

一些蓝牙不能传出声音很有可能就是这里出现了问题!





http://www.ppmy.cn/news/641601.html

相关文章

移动**21*设置无法接通_电话打得出去,但别人打你的电话提示用户无法接通,是怎么回事?...

大家好,这里是大哥大杂谈,欢迎大家关注。今天我们来谈谈手机通信相关的一些问题。 问题现象 不知道有没有人遇到过这种情况,在某些地方自己打电话可以打出去,但是他人打你的电话的时候,会出现提示无法接通用户&#xf…

手机显示无法接通服务器怎么办,手机无法接通是什么原因及如何解决【图文】...

手机,已经成为我们日常生活中必不可缺少的电子产品,不论男女老少一般都配备有一部手机,有些人甚至配备了两部、三部手机。手机的主要功能是通讯功能,给别人拨打电话或者接听别人拨打的电话。有时候我们在拨打别人电话的时候可能会…

手机显示无法接通服务器是怎么回事,手机暂时无法接通是什么原因 可能处于飞行模式...

我们在拨打别人电话的时候,经常会听到对面传来”您拨打的电话暂时无法接通”的声音,那么导致手机暂时无法接通的原因是什么呢,接下来我就给大家详细介绍一下,可能导致这个情况发生的四个原因,让我们一起来看看吧。 导致…

苹果7显示无法接通激活服务器,打电话时,显示对方手机暂时无法接通是什么原因?答案其实很简单...

如果说我们在拨打电话的时候出现对方手机暂时无法接听的问题,那么其主要的原因就是在于用户将自己的手机设置成为一个飞行模式,其实对于飞行模式来说,只要设置之后,就会在对方拨打的时候出现这个问题。所以大家如果在拨打电话的时…

ChatGPT 和 Elasticsearch:分面、过滤和更多上下文

作者:Luca Wintergerst 在最近的一篇博客文章中,我们讨论了 ChatGPT 和 Elasticsearch 如何协同工作以帮助更有效地管理专有数据。 通过利用 Elasticsearch 的搜索功能和 ChatGPT 的上下文理解,我们演示了如何改进结果。 在这篇文章中&#…

群晖NAS搭建WebDV服务手机ES文件浏览器远程访问

文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址 转载自cpolar极点云文章:群晖NAS搭建WebDAV服务手机ES文件浏览器远程访问 有时候我们想通过移动设备访问群晖NAS 中的文件,以满足特殊需求,我们在群辉中开启WebDav服…

如何在mmdetection3d下批量的预测单目3d检测结果并保存

这是为了能通过pycharm功能在服务器下可以看见图片并成批量保存做的笔记,本人不是太会说明,所以代码解释如下 from mmdet3d.apis import init_model, inference_mono_3d_detector, show_result_meshlab import glob import mmcv from os import path as…

3D Slicer将分割结果保存

1、从segmentation editor 切换回data 2、双击分割名称完成名称更改,接着鼠标右键选择导出到binary label map,如下图 3、选中步骤2生成的label,鼠标右键选择export to file,如下图 4、选择格式以及存储路径,此处我选择的是nii.gz,一般也可选…