Android4.4蓝牙耳机HFP流程分析-1

     我们可以看到google使用的是AT+CLCC的方式来获取当前通话信息的,CLCC的状态描述总共有6种,也就是:active(0)、held(1)、dialing(2)、alterting(3)、incoming(4)、waiting(5),括号里为状态对应的数值.这些状态值由Modem端返回,也就是说所有Call状态的源头在Modem端。

Telephony中的各种状态,以及它们之间的对应关系,这里简单的总结一下,Telephony中关于Call、Phone的状态有如下几6种:

1、DriverCall.State

将Modem返回的通话状态转换成最基本的Call状态,DriverCall.State包含ACTIVE、HOLDING、DIALING、ALERTING、INCOMING、WAITING6种。

2、Call.State(internal)

在整个Telephony结构中,有且只有三种Call(internal)即:foregroundCall、backgroundCall、ringingCall,这三种类型描述了系统中所有存在的Call(internal)类型,而这三种Call的状态用Call.State(internal)来描述,包含ACTIVE、HOLDING、DIALING、ALERTING、INCOMING、WAITING、IDEL、DISCONNECTING、DISCONNECTED,总共9种类型。

在实际使用中,我们并不会直接使用Call.State(internal),取而代之的是GsmConnection对象的getState方法。一个GsmCall对象可以拥有多个GsmConnection,比如在使用会议电话时,一路通话中拥有多个连接。GsmConnection对象会根据DriverCall.State的状态,将自己分配到不同的Call(fgCall、bgCall、ringingCall )对象中。比如当有一路来电时,此时会建立GsmConnection对象,并归属于ringingCall对象;而当来电被接听后,该GsmConnection对象会将自己分配到foregroundCall对象中。

3、PhoneConstants.State

在Android 4.0以及之前叫做Phone.State,用于描述手机在通话过程中的状态,其状态更新来源于Call.State(internal)。根据Call.State(internal)的状态划分为三类:IDLE、RINGING、OFFHOOK。这些状态供系统以及系统级APP使用。

PhoneConstants.State.RINGING相当于Call.State的INCOMING和WAITING。

PhoneConstants.State.OFFHOOK对应于Call.State的ACTIVE、ONHOLD、DIALING、ALERTING

4、TelephonyManager.CALL_STATE_XX

该状态源自PhoneConstants.State,并与其一一对应,即包含类型TelephonyManager.CALL_STATE_IDLE,TelephonyManager.CALL_STATE_RINGING,TelephonyManager.CALL_STATE_OFFHOOK。这些将会通过“广播”以及“PhoneStateChanged回调”通知给三方应用,该状态的主要目的也是暴露给第三方使用。例如在Bt_hf.h里的枚举btif_call_state_t。

5、Call.State(TeleService)

在Android 4.4中,Phone模块被划分为InCallUI和TeleService两部分,而这里的Call.State(TeleService)正是通话状态在TeleService中的表现,同时该状态也将为后面的InCallState提供参考基准。Call.State(TeleService)包含了基本的11种类型:ACTIVE、ONHOLD、DIALING、REDIALING、INCOMING、CALL_WAITING、DISCONNECTED、DISCONNECTING、IDLE、CONFERENCE、INVALID。

我们知道com.android.internal.telephony.Call也就是前面提及的Call(internal),GsmCall和CDMACall都是其子类,主要作用是对通话这种属性的一种抽象。而Call(TeleService)实际上是com.android.services.telephony.common.Call,在TelephonyFramework中完成了GsmCall对象的处理和操作之后,会将相关的信息在TeleService中转换为Call(TeleService)对象,并存储在HashMap中。com.android.services.telephony.common.Call实现了Parcelable接口,其作用是描述一路通话及其状态,在这里能够获得许多关于该路通话的详细信息。

6、InCallPresenter.InCallState

InCallState是用于决定InCallActivity所处状态,其包含类型为4种:NO_CALLS、INCALL、OUTGOING、INCOMING。该类型是首次出现在AndroidTelephony中,InCallUI的显示则依赖于此状态。

 InCallState.INCALL等价于Call.State(TeleService)的ACTIVE、ONHOLD、DISCONNECTING、DISCONNECTED;

 InCallState.INCOMING等价于Call.State(TeleService)的INCOMING、CALL_WAITING

 InCallState.OUTGOING等价于Call.State(TeleService)的DIALING、REDIALING

     Telephony中的各种状态并不是独立存在的,它们之间是一种由底向上的依赖关系,即底层Modem端通话状态发生了改变,那么顶层的InCallSate状态也会随之而变化,不同的状态具有不同的作用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值