Andriod 解析通话处理流程(一)

本文详细解析了Android通话处理流程,包括从Java端发送AT命令的处理流程、拨出电话流程、请求拨号的Java部分流程及c/c++部分流程等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Andriod通话处理流程

         一、总览 
        1、从java端发送at命令的处理流程。 
        2、unsolicited 消息从modem上报到java的流程。 
        3、猫相关的各种状态的监听和通知机制。 
        4、通话相关的图标变换的工作原理。 
        5、gprs拨号上网的通路原理。 
        6、通话相关的语音通路切换原理、震动接口。 
        7、通话相关的notification服务。 
        8、通话相关的各种server。 

         第一部分:从java端发送at命令的处理流程。 

        拨出电话流程: 

        1、contacts的androidmanifest.xml android:process="android.process.acore"说明此应用程序运行在acore进程中。 
       DialtactsActivity的intent-filter的action属性设置为main,catelog属性设置为launcher,所以此activity能出现在主菜单中,并且是点击此应用程序的第一个界面。dialtactsactivity包含四个tab,分别由TwelveKeyDialer,RecentCallsListActivity,两个activity-alias DialtactsContactsEntryActivity和DialtactsFavoritesEntryActivity分别 

        表示联系人和收藏tab,但是正真的联系人列表和收藏是由ContactsListActivity负责。

        2、进入TwelveKeyDialer OnClick方法,按住的按钮id为: R.id.digits,执行 

java代码:
  1. placecall() 
  2. Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, 
  3. Uri.fromParts("tel", number, null)); 
  4. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
  5. startActivity(intent); 
复制代码

        3、intert.ACTION_CALL_PRIVILEGED实际字符串为android.intent.action.CALL_PRIVILEGED,通过查找知道了packegs/phone 
        下面的androidmanifest.xml中PrivilegedOutgoingCallBroadcaster activity-alias设置了intent-filter,所以需要找到其targetactivity为OutgoingCallBroadcaster。所以进入OutgoingCallBroadcaster的 onCreate() //如果为紧急号码马上启动intent.setClass(this, InCallScreen.class); startActivity(intent); 

java代码:
  1. Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL); 
  2. if (number != null) broadcastIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number); 
  3. broadcastIntent.putExtra(EXTRA_ALREADY_CALLED, callNow); 
  4. broadcastIntent.putExtra(EXTRA_ORIGINAL_URI, intent.getData().toString()); 
  5. if (LOGV) Log.v(TAG, "Broadcasting intent " + broadcastIntent + "."); 
  6. sendOrderedBroadcast(broadcastIntent, PERMISSION, null, null, 
  7. Activity.RESULT_OK, number, null); 

复制代码

       4、Intent.ACTION_NEW_OUTGOING_CALL实际字符串为android.intent.action.NEW_OUTGOING_CALL,通过查找知道了packegs/phone 
       下面的androidmanifest.xml中OutgoingCallReceiver Receiver接收此intent消息。找到OutgoingCallReceiver,执行 onReceive()函数

java代码:
  1. Intent newIntent = new Intent(Intent.ACTION_CALL, uri); 
  2. newIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number); 
  3. newIntent.setClass(context, InCallScreen.class); 
  4. newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

复制代码

5、请求拨号的java部分流程 
onCreate(第一次)/onNewIntent(非第一次) 

java代码:
  1. internalResolveIntent 
  2. placeCall(intent); 
  3. PhoneUtils.placeCall(mPhone, number, intent.getData()); 
  4. phone.dial(number); 
  5. mCT.dial(newDialString); 
  6. dial(dialString, CommandsInterface.CLIR_DEFAULT); 
  7. cm.dial(pendingMO.address, clirMode, obtainCompleteMessage());//obtainCompleteMessage(EVENT_OPERATION_COMPLETE); 
  8. send(rr); 
  9. msg = mSender.obtainMessage(EVENT_SEND, rr); 
  10. acquireWakeLock(); 
  11. msg.sendToTarget(); 
  12. RILSender.handleMessage() 
  13. case EVENT_SEND: 
  14. ... s.getOutputStream().write(dataLength); 
  15. s.getOutputStream().write(data);//从这里流程跑到下面ril.cpp中监听部份 

复制代码

       6、请求拨号的c/c++部分流程 
       6.1、初始化事件循环,启动串口监听,注册socket监听。 
       rild.c->main() 
       (1)、RIL_startEventLoop 

java代码:
  1. //建立事件循环线程 
  2. ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL); 
  3. //注册进程唤醒事件回调 
  4. ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true, 
  5. processWakeupCallback, NULL); 
  6. rilEventAddWakeup (&s_wakeupfd_event); 
  7. //建立事件循环 
  8. ril_event_loop 
  9. for (;;) { 
  10. ... 
  11. n = select(nfds, &rfds, NULL, NULL, ptv); 
  12. // Check for timeouts 
  13. processTimeouts(); 
  14. // Check for read-ready 
  15. processReadReadies(&rfds, n); 
  16. // Fire away 
  17. firePending(); 

复制代码


系列之Andriod 解析通话处理流程(二)的帖子链接 http://www.eoeandroid.com/thread-98260-1-1.html
系列之Andriod 解析通话处理流程(三)的帖子链接 http://www.eoeandroid.com/thread-98261-1-1.html
系列之Andriod 解析通话处理流程(四)的帖子链接 http://www.eoeandroid.com/thread-99406-1-1.html
系列之Andriod 解析通话处理流程(五)的帖子链接 http://www.eoeandroid.com/thread-99407-1-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值