没有合适的资源?快使用搜索试试~ 我知道了~
首页Android 通话模块来电和去电流程分析
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10263376/bg1.jpg)
拨出电话(语音电话)流程
第一部分:solicited 主动下发命令消息
1. 拨号功能首页面,类 DialtactsActivity
在 系 统 源 码 路 径 : /packages/apps/Contacts/ 下 的 配 置 文 件 AndroidManifest.xml 中 ,
DialtactsActivity 的 intent-filter 的 action 属性设置为 main,catelog 属性设置为 launcher,所
以应用程序首先启动的就是这个 activity。在主菜单中,并且是点击此应用程序的第一个界
面。dialtactsactivity 包含四个 tab,分别由 TwelveKeyDialer、RecentCallsListActivity,两个
activity-alias DialtactsContactsEntryActivity 和 DialtactsFavoritesEntryActivity,分别表示联系
人和收藏 tab,但是正真的联系人列表和收藏是由 ContactsListActivity 负责。
在文件 DialtactsActivity.java 中:
onCreate()->setupDialerTab():
……
intent.setClass(this, TwelveKeyDialer.class);
……
2. 点击拨号按钮
进 入类 TwelveKeyDialer 的 OnClick 方法,按 住的 按 钮 id 为 R.id.dialButton , 执 行
dialButtonPressed():
……
Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED);
intent.setData(Uri.fromParts("tel", number, null));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
……
3. 类 OutgoingCallBroadcaster
字 符 串 Intent.ACTION_CALL_PRIVILEGED 实 际 为
android.intent.action.CALL_PRIVILEGED,通过查找目录/packages/apps/Phone/下的配置文
件 AndroidManifest.xml,PrivilegedOutgoingCallBroadcaster activity-alias 的 intent-filter 设置
了此字符串,所以需要找到其 targetactivity 为 OutgoingCallBroadcaster。
![](https://csdnimg.cn/release/download_crawler_static/10263376/bg2.jpg)
所以进入类 OutgoingCallBroadcaster:
OutgoingCallBroadcaster.java->onCreate()->processIntent():
……
//如果为紧急号码,则马上启动
if (callNow)
{
intent.setClass(this, InCallScreen.class);
startActivity(intent);
}
…….
Uri uri = intent.getData();
Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);
if (number != null)
{
broadcastIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);
}
broadcastIntent.putExtra(EXTRA_ALREADY_CALLED, callNow);
broadcastIntent.putExtra(EXTRA_ORIGINAL_URI, uri.toString());
……
sendOrderedBroadcast(broadcastIntent, PERMISSION,
new OutgoingCallReceiver(), null, Activity.RESULT_OK, number, null);
4.类 OutgoingCallReceiver
由 第 3 步 可 知 , 类 OutgoingCallReceiver 接 收 此 intent 消 息 。 在
OutgoingCallBroadcaster.java 中找到类 OutgoingCallReceiver:
onReceive()->doReceive()->startSipCallOptionsHandler():
Intent newIntent = new Intent(Intent.ACTION_CALL, uri);
newIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);
……
newIntent.setClass(context, InCallScreen.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
……
5. 请求拨号的 java 部分流程
InCallScreen.class->onCreate(第一次)/onNewIntent(非第一次)
internalResolveIntent()
placeCall(intent)
PhoneUtils.placeCall(phone, number, contactUri, mIsStkCall)
PhoneApp.getInstance().mCM.dial(phone, number, isStkCall) ( 即 CallManager.dial(phone,
![](https://csdnimg.cn/release/download_crawler_static/10263376/bg3.jpg)
number, isStkCall))
Phone.dial(dialString,isStkCall)(这一步不会执行,直接执行下一步)
GSMPhone.dial(dialString,isStkCall)
mCT.dial(mmi.dialingNumber, mmi.getCLIRMode(), uusInfo) ( 即 GsmCallTracker.
dial(mmi.dialingNumber, mmi.getCLIRMode(), uusInfo))
cm.dial(pendingMO.address, clirMode, uusInfo, isStkCall, obtainCompleteMessage()) ( 即
CommandsInterface. Dial())//obtainCompleteMessage(EVENT_OPERATION_COMPLETE)
RIL. dial () //因类 RIL 实现了 CommandsInterface 接口,直接跳至此处
RIL.send(rr)
RILSender.handleMessage():
……
case EVENT_SEND:
s.getOutputStream().write(dataLength);
s.getOutputStream().write(data);
代码从这里流程跑到下面 ril.cpp 中监听部分
6. 请求拨号的 c/c++部分流程
6.1 初始化事件循环,启动串口监听,注册 socket 监听
rild.c->main()
(1)RIL_startEventLoop
//建立事件循环线程
ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
//注册进程唤醒事件回调
eventLoop():
ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,
processWakeupCallback, NULL);
rilEventAddWakeup (&s_wakeupfd_event);
//建立事件循环
ril_event_loop();
for (;;)
{
n = select(nfds, &rfds, NULL, NULL, ptv);
// Check for timeouts
processTimeouts();
// Check for read-ready
![](https://csdnimg.cn/release/download_crawler_static/10263376/bg4.jpg)
processReadReadies(&rfds, n);
// Fire away
firePending();
}
(2)RIL_Init
//实际是通过动态加载动态库的方式执行 reference-ril.c 中的 RIL_Init
funcs = rilInit(&s_rilEnv, argc, rilArgv);
reference-ril.c->RIL_Init():
//单独启动一个线程读取串口数据
ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);
mainLoop():(用来监控 readerLoop)
fd = open (s_device_path, O_RDWR);
ret = at_open(fd, onUnsolicited);
ret = pthread_create(&s_tid_reader, &attr, readerLoop, &attr);
RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);
在 initializeCallback 中执行的程序
(3)RIL_register()(ril.cpp)
//注册 rild socket 端口事件监听到事件循环中
s_fdListen = android_get_control_socket(SOCKET_NAME_RIL);
ret = listen(s_fdListen, 4);
ril_event_set (&s_listen_event, s_fdListen, false, listenCallback, NULL);
//将此端口加入事件 select 队列
rilEventAddWakeup (&s_listen_event);
如果 rild socket 端口有数据来了将执行 listencallback 函数。
listencallback():
//为此客户端连接创建新的监听句柄,s_fdListen 继续监听其他客户端的连接
s_fdCommand = accept(s_fdListen, (sockaddr *) &peeraddr, &socklen);
ril_event_set (&s_commands_event, s_fdCommand, 1,
processCommandsCallback, p_rs);
//将此端口加入事件 select 队列
rilEventAddWakeup (&s_commands_event);
![](https://csdnimg.cn/release/download_crawler_static/10263376/bg5.jpg)
6.2、socket 监听,收到 dial 的 socket 请求
processCommandsCallback():
//读数据到 p_record 中
ret = record_stream_get_next(p_rs, &p_record, &recordlen);
processCommandBuffer(p_record, recordlen);
p.setData((uint8_t *) buffer, buflen);
// status checked at end
status = p.readInt32(&request);
status = p.readInt32 (&token); //请求队列中的序号
pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
pRI->token = token;
/*
包含#include "ril_commands.h"语句,
static CommandInfo s_commands[] = {
#include "ril_commands.h"
};
结构体如下:
typedef struct {
int requestNumber;
void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);
int(*responseFunction) (Parcel &p, void *response, size_t responselen);
} CommandInfo;
*/
pRI->pCI = &(s_commands[request]);
pRI->p_next = s_pendingRequests;
s_pendingRequests = pRI;
pRI->pCI->dispatchFunction(p, pRI);
//假设是接收了 dial 指令,pRI->PCI->dispatchFunction(p,pRI),调用 dispatchDial (p,pRI)
dispatchDial (p,pRI):
s_callbacks.onRequest(pRI->pCI->requestNumber, &dial, sizeof(dial), pRI);
// 即调用文件 reference-ril.c 中的函数 onRequest()
onRequest():
switch (request)
{
……
case RIL_REQUEST_DIAL:
requestDial(data, datalen, t);
asprintf(&cmd, "ATD%s%s;", p_dial->address, clir);
ret = at_send_command(cmd, NULL);
err = at_send_command_full ();
剩余22页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/f406a376ca6a41fb87305c5892afbaec_nanfeng5651.jpg!1)
nanfeng5651
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 保险服务门店新年工作计划PPT.pptx
- 车辆安全工作计划PPT.pptx
- ipqc工作总结PPT.pptx
- 车间员工上半年工作总结PPT.pptx
- 保险公司员工的工作总结PPT.pptx
- 报价工作总结PPT.pptx
- 冲压车间实习工作总结PPT.pptx
- ktv周工作总结PPT.pptx
- 保育院总务工作计划PPT.pptx
- xx年度现代教育技术工作总结PPT.pptx
- 出纳的年终总结PPT.pptx
- 贝贝班班级工作计划PPT.pptx
- 变电值班员技术个人工作总结PPT.pptx
- 大学生读书活动策划书PPT.pptx
- 财务出纳月工作总结PPT.pptx
- 大学生“三支一扶”服务期满工作总结(2)PPT.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)