上一节介绍了PLMN的读取流程,本节来介绍SPN的读取流程。
SPN(Service Provider Name)就是当前发行SIM卡的运营商的名称,可以从以下两个路径获取:
1、从SIM文件系统读取2、从配置文件读取
我们本节就来分析该字串的读取过程。
一、从SIM读取SPN过程
@SIMRecords.java
protected void fetchSimRecords() {
getSpnFsm(true, null);
}
请注意,此时的getSpnFsm()的
start参数为true,而且mSpnState为初始化值:GetSpnFsmState.IDLE
private void getSpnFsm(boolean start, AsyncResult ar) {
byte[] data;
if (start) {
if(mSpnState == GetSpnFsmState.READ_SPN_3GPP ||
mSpnState == GetSpnFsmState.READ_SPN_CPHS ||
mSpnState == GetSpnFsmState.READ_SPN_SHORT_CPHS ||
mSpnState == GetSpnFsmState.INIT) {
mSpnState = GetSpnFsmState.INIT;
return;
} else {
//mSpnState默认为IDLE,然后修改为INIT
mSpnState = GetSpnFsmState.INIT;
}
}
switch(mSpnState){
case INIT:
//初始化SPN
setServiceProviderName(null);
//从SIM的EF_SPN读取SPN
mFh.loadEFTransparent(EF_SPN, obtainMessage(EVENT_GET_SPN_DONE));
mRecordsToLoad++;
//mSpnState修改为READ_SPN_3GPP
mSpnState = GetSpnFsmState.READ_SPN_3GPP;
break;
case READ_SPN_3GPP:
case READ_SPN_CPHS:
case READ_SPN_SHORT_CPHS:
default:
mSpnState = GetSpnFsmState.IDLE;
}
}
在上面的过程中,将会从EF_SPN中读取当前SPN,并且将mSpnState置为READ_SPN_3GPP。
当读取完毕后,在handleMessage()中读取反馈:
public void handleMessage(Message msg) {
try {
switch (msg.what) {
case EVENT_GET_SPN_DONE:
isRecordLoadResponse = true;
ar = (AsyncResult) msg.obj;
getSpnFsm(false, ar);
break;
}
} catch (RuntimeException exc) {
} finally {
if (isRecordLoadResponse) {
onRecordLoaded();
}
}
}
然后再次进入getSpnFsm()中处理,此时的mSpnState状态为READ_SPN_3GPP,而sta