特殊字符处理流程

第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.cppRFX_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);

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值