第1章特殊字符处理流程
1.1 处理字符入口
1.1.1拨号盘接受特殊字符
DialpadFragment. afterTextChanged---》SpecialCharSequenceMgr.handleChars—》handleDeviceIdDisplay方法
1.2.1特殊字符传输
/packages/apps/Dialer/java/com/android/dialer/dialpadview/
SpecialCharSequenceMgr. handleDeviceIdDisplay中处理接收到的*#06#;
会调用telephonyManager.getDeviceId()获取设备的IMEI。
1.2 中间处理流程
1.2.1 TelephonyManager
/frameworks/base/telephony/java/android/telephony/TelephonyManager.java
1)getDeviceId():
ITelephony telephony = getITelephony();
telephony.getDeviceId(mContext.getOpPackageName());
2)getDeviceId(int slotIndex):
IPhoneSubInfo info = getSubscriberInfo();--》IPhoneSubInfo.Stub.asInterface(ServiceManager.getService("iphonesubinfo"));
搜”extends IPhoneSubInfo.Stub”,发现PhoneSubInfoController.java继承了IPhoneSubInfo.Stub。
PhoneSubInfoController.java中是通过phone.getDeviceId()。
接着可以看一下GsmCdmaPhone
info.getDeviceIdForPhone(slotIndex, mContext.getOpPackageName());、
1.2.2 GsmCdmaPhone
/frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaPhone
1)getDeviceId():如果是isPhoneTypeGsm() 或者 force_imei就会调用—》getImei(),返回mImei
否则的话就会调用getMeid()—》如果getMeid()不为空就返回mMeid,
为空的话就返回getEsn()
case EVENT_GET_DEVICE_IDENTITY_DONE:{
ar = (AsyncResult)msg.obj;
String[] respId = (String[])ar.result;
mImei = respId[0];
mImeiSv = respId[1];
mEsn = respId[2];
mMeid = respId[3];
1.2.3 RIL
/frameworks/opt/telephony/src/java/com/android/internal/telephony/RIL.java
1)getDeviceIdentity(Message result):
RILRequest rr = obtainRequest(RIL_REQUEST_DEVICE_IDENTITY, result, mRILDefaultWorkSource);
在RIL的这个方法里面会从底层获取RIL_REQUEST_DEVICE_IDENTITY 消息,然后反馈给上层。至此上层部分特殊字符处理逻辑基本就到这里,接下来会看稍稍偏向底层的内容。
1.3 RmcOemRequestHandler
1.3.1以mtk平台为例
以下目录是:mtk平台ril处理对应目录,现在mtk平台ril层相关处理都是用的/vendor/mediatek/proprietary/hardware/ril/fusion/mtk-ril这一块的内容。
/vendor/mediatek/proprietary/hardware/ril/fusion/mtk-ril/mdcomm/oem/RmcOemRequestHandler.cpp
1)RmcOemRequestHandler. onHandleRequest:
case RFX_MSG_REQUEST_DEVICE_IDENTITY:--》requestDeviceIdentity(msg);
在requestDeviceIdentity 函数里面会通过AT命令调用IMEI等相关内容:
通过AT命令AT+CGSN查找IMEI:p_response = atSendCommandNumeric("AT+CGSN");
通过AT命令AT+GSN查找GSN:p_responseGSN = atSendCommandMultiline("AT+GSN", "+GSN:");
1.4 查找日志
1.4.1查找上层日志
1)查找RIL:RIL_REQUEST_DEVICE_IDENTITY 消息等
1.4.2查找底层日志
1)查找RmcOemRequestHandler.cpp:RFX_MSG_REQUEST_DEVICE_IDENTITY消息。
查找AT命令AT+CGSN等。
find -name "tct-res"
1、在GsmCdmaPhone的构造函数中已经执行了initOnce方法;
在GsmCdmaPhone.initOnce方法中注册了EVENT_RADIO_AVAILABLE,EVENT_RADIO_ON等有关RADIO事件的监听;
RadioManager.registerListener方法中注册EVENT_RADIO_AVAILABLE监听,监听RIL收到的EVENT_RADIO_AVAILABLE。
2、如果GsmCdmaPhone收到EVENT_RADIO_AVAILABLE消息,会调用handleRadioAvailable()方法
3、在handleRadioAvailable()方法里面调用RIL的mCi.getDeviceIdentity(obtainMessage(EVENT_GET_DEVICE_IDENTITY_DONE)),获取设备的IMEI
4、RIL.getDeviceIdentity方法从和modem交互,获取RIL_REQUEST_DEVICE_IDENTITY消息。
obtainRequest(RIL_REQUEST_DEVICE_IDENTITY, result, mRILDefaultWorkSource);