call就是平时我们常用的通话功能,最基本的就是来电incoming call,拨打电话outgoing call,挂断电话hangupcall,一般来说拨打一方成为主叫方,接听方为被叫方。Call模块常用的一些名词有:
1. dialing call
拨打一路电话,对方尚未接听,主叫方等待被交接听的时候的状态即为dialing状态
2. active call
激活通话:双方正在进行的正常的通话
3. hold call
保持通话:即将当前通话挂起,双方不管主叫还是被叫方都听不到对方的声音
4. mute call
静音:静音后对方听不到静音发起方的声音,但是静音发起方能听到对方的声音
5. waiting call
正在通话过程中,第三方电话拨打进来,第三方对于当前正在通话的用户来讲就是waiting call等待接进来的电话
6. end all
结束通话
7. Auto redial
自动重拨:此项功能一般在call setting当中会让用户选择打开或是关闭,如果打开,则设备首次呼叫失败后,一般会自动再次拨打该号码,一般可自动重拨7次,也有可能更多,且前两次自动重拨的间隔时间较短,后面几次则较长
8. Quick dial
快速拨号:即在call setting中设置一个按键(一般为数字键)的对应一个常用的号码,在idle界面长按该按键就可显示出该号码,并且可以正常拨打出去
9. Answer mode:
应答模式:是用户对来电的接听方式,默认情况下一般按接听键可以接听。在call setting中一般会有此选项,用户可以自由选择。
- 自动应答:一般响铃5秒钟左右,电话自动接通
- 按任意键应答:除挂断键和power键之外的任意键可接听来电
一. Call的一些常见业务类型:
1. call waiting
呼叫等待:此项功能需要运营商支持并开通,一般卡都支持此项功能并且运营商默认开通,一般手机在call setting里面会有一项打开或关闭此项功能的选项,用户可以自由选择。如用户设置了呼叫等待,则可实现在通话时,若有第三方呼入,会有提示音和提示画面,此时可以选择接听,拒绝或是忽略该呼叫。如果选择接听第三方来电,则原通话将会被保持而不会被挂断,当然也可以选择接听并挂断原通话。如果拒绝,则会挂断第三方通话,原通话不受影响。
2. call forwarding
呼叫转移:呼叫转移是将来电转接到其他电话上的一种功能,需要运营商支持和开通,并非所有SIM/USIM卡都有此项功能,转移的号码可以是手机号码也可以是固定电话号码,具体包括:
- 无条件转移:即任意来电都将被转移到设置好的好马上去
- 无应答转移:若来电无应答,一段时间(由网络段决定这个时间段的长短,一般是25秒左右)后,电话将被转移到设置好的电话号码上去
- 无法接通转移:无电话无法接通(比如关机,无信号等)时,电话将被转移到设置好的电话号码上去
- 占线中转移:若电话正在通话中,再呼入一路电话,这路电话将被转移到设置好的电话号码上去
3. call barring
呼叫限制:呼叫限制是对呼出或来电认为做出一些限制,以限制电话的呼出或者呼入。此功能并非所有的SIM/USIM卡都支持,据我了解,目前只有开通了国际通话功能的中国移动旗下的全球通卡支持此项功能。具体包括:
- 所有呼出:手机将无法呼出任何电话,一般会有呼叫被限制的提示
- 所有来电:手机将不能接入任何来电
- 所有国际呼出:不能拨打任何境外电话
- 所有国际来电:任何国际来电将不能被接入
- 仅限本地呼入呼出:所有本地呼入呼出将被禁止
4. multi-party
多方通话(并非所有的卡都支持此功能):多方通话的前提条件是此卡必须支持呼叫等待并且呼叫等待功能必须开启。
当在通话过程中,再来一路通话,此时将第三方电话接起后形成多方通话,此时原来的那路通话被挂起(即在保持hold状态),此时这路被保持的通话将听不到这边的任何声音,新来的电话被接进来即为激活状态,保持和激活状态可以互相切换。所以一般多方通话会有一个菜单选项里面包含:静音,保持/激活,加入会议通话,挂断当前,挂断保持等跟call相关的选项
多方通话当中还包含会议通话:当存在多方通话时可选择加入电话会议,加入电话会议的各方均能互相听到彼此间的声音,可进行多方会谈。电话会议的菜单选项一般包括:加入/退出电话会议(选择任意一个成员),静音,电话会议成员列表,挂断全部,挂断某一路程远等,若挂断全部,则会逐一出现每个电话的挂断界面,电话会议的时间以最早建立的时间为准。多方通话包括会议通话最大支持七路通话,电话会议也有人数限制,运营商不同最大人数也不同,当达到最大限制时将无法加入电话会议。
二. Call的处理状态
一个phone有且仅有三个call,分别是RingCall,ForgroundCall以及BackgroundCall,可以简单的理解为每个call对应四种状态(此处暂不去关心三种Call之间的状态区别)Ring, Active, Hold,Idle,同一时刻三个Call只能有一个Ring状态(RingCall), 一个Active状态(ForgroundCall), 一个Hold状态(BackgroundCall),可以同时有三个Idle状态。所以涉及到Call不同状态间如何切换的问题。
Android 中对单卡情况的处理:
- 1.当有Ring call时,不允许hold和active切换;
- 2.既有Ring call,又有Hold call时,挂断Ring call会连带Hold call一起挂断。
- 3.同时有Active call和Hold call,挂断时先挂Active call再挂Hold call
其实在我们的代码中,确切的来说不是Call而是connection的概念。RingCall只能建立一路connection,而ForgroundCall和BackgroundCall则可以同时建立多路connection,尤其是又多方通话或者是会议通话的时候,三种状态最多可同时建立七路connection。有关call状态的切换图如下所示:
来自:http://www.jianshu.com/p/d715226f0e7a