第1章 主动拨号流程分析

第1章 主动拨号流程分析

Java Application应用层《--------》Dialer拨号盘和Phone应用;

Java Frameworks 框架层《--------》Telephony Frameworks层

User Libraries系统运行库层《--------》RIL层

拨打电话的大致流程是:DialerTeleComServiceTeleComFrameworkTeleponyServiceTelephonyFrameworkRIL

总结:

DialpadFragment.onClick()

DialpadFragment.handleDialButtonPressed()

CallIntentProcessor.processIntent()

CallsManager. startOutgoingCall()

CallsManager.java的placeOutgoingCall()

ConnectionService. createConnection()

TelephonyConnectionService.onCreateOutgoingConnection()

GsmCdmaPhone.dial()--》dialInternal()

RIL.dial()

拨号流程总体时序图分析:

拨号流程时序图1

拨号流程时序图图2

 

1.1 拨号界面DialtactsActivity的onClick

ActivityManager启动DialtactsActivity的Actiivity拨号盘界面,DialtactsActivity中的onClick方法便是进入拨号盘的代码入口。

在onClick方法中会调用mDialpadFragment.dialButtonPressed()和mDialpadFragment.showDialpadFragment

1.2 DialpadFragment拨号盘表单

目录是:/packages/apps/Dialer/java/com/android/dialer/dialpadview/DialpadFragment.java

如果我们按了拨打电话的按钮就会调用dialButtonPressed();---handleDialButtonPressed();

1)handleDialButtonPressed():的作用是判断是不是空号,是不是禁播号码;创建intent,并调用DialerUtils. startActivityWithErrorToast()方法。

判断是不是空号,是不是禁播号码

else{正常拨号中创建intent

 

//调用DialerUtils. startActivityWithErrorToast

 

图1创建intent,调用DialerUtils的方法

2)CallUtil中

CallUtil.getCallIntent(String number, PhoneAccountHandle accountHandle)--》getCallIntent(number, null, accountHandle)---》getCallIntent(getCallUri(number), callOrigin, accountHandle);--》……--》最终会调用getCallIntent( Uri uri, String callOrigin, PhoneAccountHandle accountHandle, int videoState)

我们看一下getCallUri(),它是将号码封装成uri;且会判断是普通电话流程还是网络电话流程。

图2它是将号码封装成uri

接着看一下最后调用的getCallIntent(),这里intent就创建完了,intent创建完了就会传入CallUtils里面的startActivityWithErrorToast()方法【N4手机】

图3最终的getCallIntent(),在过程中会将号码封装成uri

3)DialerUtils. startActivityWithErrorToast()

 

图4会用到CallUtil的startActivityWithErrorToast()

CallUtil的startActivityWithErrorToast()

 

图5会调用TelecomManager.placeCall()

【getTelecomManager是TelecomManager类型的】

getTelecomMan

总结改写以下内容,仅用文字表述:客户定制语音功能与平台不同,需要进行修改的场景为3-way和call-waiting场景,完全新增的场景为call transfer场景。 客户的3-wag场景为:当存在ABC三个用户时,在AB进行通话时,既可以由正在进行通话的一个用户主动呼叫,再进行三方通话;也可以由第三方用户主动呼叫此时正在进行通话的用户来发起三方通话。 客户的call-waiting场景由于仅使用Flash key的要求限制,为了实现第三方用户主动呼叫正在进行通话的用户来发起三方通话,取消了按拍叉键切换通话对象的功能。 客户新增的场景为call transfer,此功能与call forwarding类似,都是实现呼叫转移功能,区别在于call forwarding是通过在样机软件内部配置规则实现,而call transfer依照用户的操作执行转发,客户定制的场景分别为:blind transfer场景和attend transfer场景,具体描述如下: Blind transfer:当存在ABC三个用户时,在AB进行通话时,此时A用户按下拍叉去呼叫C,在C振铃后A用户挂断电话,然后C接通电话即可BC用户进行通话。使用场景为:当AB正在通话,此时B用户不知道C的号码但是A用户知道,即可由A用户发起对C用户的呼叫,使BC用户进行通话。 Attend transfer: 当存在ABC三个用户时,在AB进行通话时,此时A用户按下拍叉去呼叫C,在C接通电话后A再挂断电话,然后BC即可进行通话。此场景下AC用户可以先进行交流然后再由BC用户进行通话,而在blind transfer场景下AC完全不进行沟通。
最新发布
03-08
### 客户定制的语音功能需求 #### 3-Way通话的支持模式 在客户定制的语音功能中,3-way通话支持两种主要模式: - **模式一**:当A和B正在进行通话时,其中任意一方可以邀请第三方C加入当前对话,从而形成三方共同参与的通话环境[^1]。 - **模式二**:如果第三方C希望参与到已经存在的AB通话之中,则可以直接拨打正在通话中的A或B的一方电话来发起这个过程,在获得应允之后便能顺利建立三者之间的联系通道[^1]。 ```python def initiate_three_way_call(participants, caller): """ 发起三方通话 :param participants: 参与者的列表 ['A', 'B'] :param caller: 主叫方 'C' """ if len(participants) != 2 or not isinstance(caller, str): raise ValueError("Invalid input parameters") # 假设这里是调用API去通知运营商网络创建一个新的多方会话... print(f"{caller} has joined the call with {participants}") ``` #### Call Waiting (来电等待) 对于Call Waiting场景而言,由于仅依赖于Flash Key操作而不再提供通过按拍叉键来进行不同通话对象间的快速切换选项。这意味着用户在接受新的呼入请求之前不会中断现有的连接状态,并且一旦选择了接听新来电则原通话语音流会被暂时搁置直到再次激活为止[^1]。 ```bash # 当有另一个来电时触发此命令模拟处理逻辑 echo "New incoming call... Press Flash to accept" read -p "> " if [[ $REPLY == "Flash" ]]; then echo "Switched to new call." else echo "Ignored new call request." fi ``` #### Call Transfer (呼叫转移) 新增加了两种类型的呼叫转移服务——盲转(Blind Transfer) 和代答转(Attended Transfer): - **盲转**: A在与B交谈过程中想要将对方转移到另一名接收者C处,只需简单地拨号给目标号码并立刻结束自己的通话即可完成整个流程;此时被转接的人将会听到提示音告知其已被成功移交至指定位置[^1]。 - **代答转**: 这种情况稍微复杂一些,它允许初始发话人在确认最终接受者已准备好接手之后再做出离开与否的选择。具体来说就是先由A联系到潜在的新参与者C并与之沟通完毕后才正式实施交接动作,期间还可以选择保留在线旁听直至满意为止[^1]。 ```python class CallTransfer: def __init__(self, current_participant='A'): self.current_participant = current_participant def blind_transfer(self, target='C'): """执行盲转""" print(f"{self.current_participant} is transferring call blindly to {target}.") def attended_transfer(self, intermediary='B', final_recipient='C'): """执行带监听的转移""" print(f"{self.current_participant} starts an attended transfer involving {intermediary} and {final_recipient}.") # 模拟AC之间短暂交流的过程... print(f"Now transferring from {intermediary} to {final_recipient}, please wait.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值