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

Posted kwincaq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络运营商名称显示 SIM名称显示相关的知识,希望对你有一定的参考价值。

一 网络名称显示这部分比较复杂,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设定进去。

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

以上是关于网络运营商名称显示 SIM名称显示的主要内容,如果未能解决你的问题,请参考以下文章

苹果手机sim卡插上显示无sim卡

知道 J2ME 中的网络运营商名称

sim卡无服务是怎么回事 手机卡突然变成无服务是怎么回事?

苹果手机怎么设置不显示运营商名称?

android 判断是不是有sim卡及运营商

苹果手机 怎么设置不显示运营商名称