免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2251 | 回复: 0
打印 上一主题 下一主题

android 电话流程分析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-28 09:08 |只看该作者 |倒序浏览
dial流程
Activity.java (frameworks\base\core\java\android\app):     
public boolean onKeyDown(int keyCode, KeyEvent event)
  Intent intent = new Intent(Intent.ACTION_DIAL,  Uri.parse("tel:" + str));
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);   

  RecentCallsListActivity.java (packages\apps\contacts\src\com\android\contacts):        
  setDefaultKeyMode(DEFAULT_KEYS_DIALER);
  PhoneUtils.java (packages\apps\phone\src\com\android\phone)
    static int placeCall(Phone phone, String number, Uri contactRef)
      Connection cn = phone.dial(number);
      GSMPhone()
        dial (String dialString)
          mCT.dial(mmi.dialingNumber, mmi.getCLIRMode());
            CallTracker mCT;
            CallTracker类 dial (String dialString)
              dial (String dialString, int clirMode)
                cm.dial(pendingMO.address, clirMode, obtainCompleteMessage());

                //因为 RIL.java (frameworks\base\telephony\java\com\android\internal\telephony\gsm):
                //public final class RIL extends BaseCommands implements CommandsInterface所以 cm.dial
                //实际上调用的是 RIL.java 中的dial
                dial (String address, int clirMode, Message result)
                  RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);
                  send()
                    msg.sendToTarget();
                      target.sendMessage(this);
                      //Handler.java (frameworks\base\core\java\android\os)
                      boolean sendMessage(Message msg)
                        //Handler.java (frameworks\base\core\java\android\os)
                        return sendMessageDelayed(msg, 0);
                          return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
                            sent = queue.enqueueMessage(msg, uptimeMillis);
                            //把消息放入到消息队列
                            public void handleMessage(Message msg)
                              s.getOutputStream().write(dataLength);                    
                              s.getOutputStream().write(data);
因为在 RIL.java 文件中有 static final String SOCKET_NAME_RIL = "rild";
run()函数中有:
                    s = new LocalSocket();
                    l = new LocalSocketAddress(SOCKET_NAME_RIL,
                            LocalSocketAddress.Namespace.RESERVED);
                    s.connect(l);
                    ...
                    mSocket = s;

所以我们可以确定s.getOutputStream().write(data) 是往 rild 的socket写数据。
下面为 rild 收到数据后的处理流程。
  static void processCommandsCallback(int fd, short flags, void *param)
    processCommandBuffer(p_record, recordlen);
      status = p.readInt32(&request);
      pRI->pCI = &(s_commands[request]);
      pRI->pCI->dispatchFunction(p, pRI);
因为 RIL.java (frameworks\base\telephony\java\com\android\internal\telephony\gsm):
中dail函数中有:        
RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);
而 Ril_commands.h (hardware\ril\libril):中有:
{RIL_REQUEST_DIAL, dispatchDial, responseVoid},
所以此时执行的是 Ril.cpp (hardware\ril\libril)文件中的:
static void dispatchDial (Parcel& p, RequestInfo *pRI)
  s_callbacks.onRequest(pRI->pCI->requestNumber, NULL, 0, pRI);
    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 (command, NO_RESULT, NULL,NULL, 0, pp_outResponse);
               at_send_command_full_nolock()
                  err = writeline (command);
补充:
BaseCommands.java (frameworks\base\telephony\java\com\android\internal\telephony\gsm):
public abstract class BaseCommands implements CommandsInterface
[android] trace radio interface layer (RIL) by two emulators
http://i-miss-erin.blogspot.com/2009/04/android-trace-radio-interface-layer-ril.html
How to dial out a call in Android? I traced the radio log and make sure the whole procedure and the source code.
==============================================================================


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/49742/showart_1912558.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP