[FAQ09394][NW]网络运营商名称显示&SIM名称显示
2017-08-31 11:00
429 查看
[DESCRIPTION]
网络运营商名称显示 源 介绍
[SOLUTION]
一 网络名称显示这部分比较复杂,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卡所属operator的名字,与网络无关;上面的网络名称是指SIM卡注册的网络所属operator的名称(比如 中国移动 的卡出国可能注册到Orange的网络,那么SIM卡的名称是”中国移动”,而此时网络名称可能是”Orange”)
网络运营商名称显示 源 介绍
[SOLUTION]
一 网络名称显示这部分比较复杂,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卡所属operator的名字,与网络无关;上面的网络名称是指SIM卡注册的网络所属operator的名称(比如 中国移动 的卡出国可能注册到Orange的网络,那么SIM卡的名称是”中国移动”,而此时网络名称可能是”Orange”)
相关文章推荐
- 网络运营商名称显示&SIM名称显示
- [FAQ08919][NW]网络运营商名称显示规则(锁屏界面,下拉列表)---网络名称 客制化方法 和 问题处理flow
- 网络运营商名称显示&SIM名称显示
- [FAQ10470]锁屏界面运营商名称显示全大写
- [FAQ09809][NW]运营商名称支持多语言
- android 网络运营商名称显示规则(锁屏界面,下拉列表)
- 使用CoreTelephony获得SIM卡网络运营商名称
- 改运营商显示名称的详细教程
- Android运营商名称显示之PLMN与SPN显示规则
- Android 本地加载网页&显示网络图片
- Qt Webkit可以做什么(二)——显示网页&获取网络服务
- 无法显示 XML 页 - 名称以无效字符开头。处理资源 'http://xxxxx' 时出错 的解决方法
- iPhone使用CoreTelephony获得SIM卡网络运营商名称
- 插入某电信卡运营商名称不显示的问题
- Android运营商名称显示之PLMN的读取
- ios中获取手机的网络状态和运营商名称
- ios如何获取手机的网络状态和运营商名称
- 判断当前网络显示运营商
- 在sim中新建联系人名称为数字时,若数字中间加空格后保存,联系人姓名显示就会颠倒过来
- Android运营商名称显示