本文档主要介绍的内容:

1:Phone和BluetoothHeadset的交互

2:BluetoothHfp的功能介绍

    Phone和BluetoothHeadset的交互:


蓝牙耳机与Phone的交互主要体现在以下几个方面:


1:挂断电话


2:接听电话


3:通话中使用蓝牙音频通道


4:拨打电话


处理流程图(图1):


android 蓝牙电话 是否静音 手机蓝牙接听电话设置_自动启动

1-2:BluetoothPhoneService在Telecome中,是被自动启动的一个service,常驻内存,一直为Phone与蓝牙的交互进行服务。其内部成员实现IBluetoothHeadsetPhone.Stub了,在HeadsetStateMachine中

bind BluetoothPhoneService,获取IBluetoothHeadsetPhone.Stub的代理,代理对象就是蓝牙和Phone的交互接口。

3:在HeadsetStateMachine中进行拨号,会使用Intent.ACTION_CALL_PRIVILEGED启动拨号流程,使用蓝牙耳机拨号拨出的是前一次的号码

4-16:通过获取IBluetoothHeadsetPhone的代理来调用BluetoothPhoneService中已实现的IBluetoothHeadsetPhone.Stub的方法进行接听,挂断,dtmf信号发送,保持通话。

 

Phone模块对Bluetooth相关的一些初始化及监听:

android 蓝牙电话 是否静音 手机蓝牙接听电话设置_自动启动_02

图形分析:

1&3-6:在BluetoothPhoneService中注册了对BluetoothAdapter.ACTION_STATE_CHAN

GED 的监听,当蓝牙状态发生变化时这里会搜到广播,根据收到的Intent中信息判断蓝牙是否开启,开启的话会跟据当前Call的状态更新蓝牙耳机的状态.最终会在HeadsetStateMachine中调用native方法进行处理.

2:在BluetoothManager中注册了BluetoothHeadset.ACTION_CONNECTION_STATE_CH

ANGED 和BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED的监听;

7-8:BluetoothHeadset的连接状态或音频状态发生变化时都会发出广播,在BluetoothMa

nager中收到广播后都会进行处理,通过判断当前的AudioState状态来进行设置。

AudioState是Frameworks/.../Telecomm:下定义的,用来存储Phone相关的声道状态:

其内部定义的常量用来判断使用哪种声道模式:

ROUTE_EARPIECE

ROUTE_BLUETOOTH

ROUTE_WIRED_HEADSET

ROUTE_SPEAKER

9&11-14:打开或关闭蓝牙声道,使用BluetoothHeadset对象进行处理,最终会在HeadsetSt

ateMachine中调用native方法进行处理

10:打开或关闭外放模式,会使用AudioManager的setSpeakerphoneOn进行设置

BluetoothHfp的功能介绍:

BluetoothHfp功能体现在让蓝牙设备控制电话,接听,挂断,拒接,语音拨号,其功能交互过程主要由HeadsetStateMachine使用IBluetoothHeadsetPhone.Stub的代理对象与BluetoothPhoneService交互完成,流程图同“图1”。