网络运营商名称显示&SIM名称显示

时间:2023-12-25 15:19:43

一 网络名称显示这部分比較复杂。Spec对这也有明白的规定,依据其优先级由高往低介绍(其优先级參考TS 22.101),

1.       Enhanced Operator Name String。也就是Eons。此种方式的名称是存放在EF_PNN(PLMN Network Name, fid: 6FC5)和EF_OPL(Operator PLMN List, fid: 6FC6)中。

EF_OPL中存放的是LAC和EF_PNN中的Record Identifier,

EF_PNN中存放的是Network Name,也就是详细的名称了。

假设注冊上的网络是HPLMN,那么EF_OPL返回的Record Identifier就是1。

假设不是HPLMN的话,就依据LAC在EF_OPL中寻找相应的Record Identifier。

然后依据OPL的Record Identifier,在PNN中找相应的Network Name。

这里须要声明一下,Record Identifier是基于1的,而EF_PNN的记录是基于0的。

也就是说,Record Identifier是1。那匹配的是EF_PNN中的第0条记录。

这个分的代码能够參考SIMRecords.java中的getEonsIfExist()方法

 

2.       Common PCN Handset Specification Operator Name String,也就是CPHS ONS。须要当前注冊的是HPLMN网络,

a.       假设SIM中的CPHS ONS的长格式文件(fid:6F14, long name)读取成功,用此当作网络名称。

b.       假设SIM中的CPHS ONS的短格式文件(fid:6F18, short name)读取成功,用此当作网络名称。

这个分的代码能够參考SIMRecords.java中的读取CPHSOns文件的部分

 

 

3.       NITZ Operator Name

此名称是由所注冊的网络下发给手机的,參考TS22.042。假设网络有下发这个数据给手机。modem会通过”+CIEV: 10”把数据传给AP端,AP端会用这个数据来当成网络名称,另外AP端还会把这个数据和相应的网络PLMN一同记下来,当之后注冊上的网络仍是这个PLMN,这显示的网络名称还会是这个网络名称。

这部分的代码能够參考ril_nw.c中的onNitzOperNameReceived()

 

4.       ROM

这一个是存储在手机flash中的,眼下的存储方式是xml文件。假设是有打开支持MVNO的option。那么下面xml都依次读取,假设读取到就终止往下读了。

假设没有MVNO,那么只读取spn-conf.xml。

假设没有读取到那么显示plmn号了。

Virtual-spn-conf-by-efspn.xml

Virtual-spn-conf-by-imsi.xml

Virtual-spn-conf-by-efpnn.xml

Virtual-spn-conf-by-efgid1.xml

Spn-conf.xml

这个分的代码能够參考ril.java中的 lookupOperatorName()方法和SpnOverride类

二 接下来看还有一个重要的名称,Service Provider Name。也就是SPN。

SPN是卡中的一个文件。fid是6F46。

读取SPN首先要看看SST中是否有这个栏位,而且这个栏位是否是activity的。

常常遇到有时候在keyguard上显示的名称和状态栏上的不一样,或者明明是这个运营商的却显示另外一个运营商的名称等等奇怪的现象,这些现象有些是和SPN是有关系的。

所以我们须要了解一下SPN的显示规则。

SPN有一个字节来规定其显示规则(參考Spec TS 31.102)

这一个字节仅用到第一和第二位,

(1)当注冊到网络是HPLMN或者是在plmn属于EF_SPDI中的网络时(默认显示SPN)。该字节的第一位的取值意义:

1:须要显示PLMN

0:不须要显示PLMN

(2)当注冊到网络不是HPLMN也不在EF_SPDI中的网络时(默认显示PLMN),该字节的第二位取值意义:

1:不须要显示SPN

0:要显示SPN

这两个bit组成的值叫做display condition。这里的plmn指的是网络名称哦,不是指plmn号。所以会有遇到仅仅显示spn而不显示网络名称的情况,而且spn的名称是sim文件里读出来的,其内容不确定的。

 

三 SIM的名称

 

非常多人对这个SIM的名称和网络名称有困扰。事实上这是两个不同的东西。SIM的名称相对于网络名称简单得多。SIM 名称是SIM info中的一个栏位,sim info是Telephony.db中的一个table。

当在SIM Framework初始化时候会下如一个默认的字串当作sim名称,这个字串的内容就是com.mediatek.internal.R.string.new_sim。在SIM ready时会去读取SIM的各种record,在record读取完毕之后才依据mcc/mnc到xml去那相应的名称,然后设定到数据库其中。这个就是sim的默认名称了。假设开机之后是打开飞行模式的。那么由于不会去读取sim
record,所以sim的默认名称会一直都是com.mediatek.internal.R.string.new_sim。

 

读取record设定sim的默认名称的代码是在SIMRecords.java中的onAllRecordedsLoaded()方法,通过mcc/mnc到lookupOperatorName中读取xml(注意,有些特殊的mcc/mnc是直接读R.string中的数据)。然后通过setDefaultNameForNewSIM设定进去。