教大家怎么修改运营商自曝带宽造假显示不再需要修改spn

2736人阅读
spn plmn(2)
Android(40)
Telephony(22)
& & & & ,本节来介绍SPN的读取流程。
& & & & SPN(Service Provider Name)就是当前发行SIM卡的运营商的名称,可以从以下两个路径获取:
& & & & 1、从SIM文件系统读取
& & & & 2、从配置文件读取
& & & & 我们本节就来分析该字串的读取过程。
一、从SIM读取SPN过程
& & & & 一般来说,SIM上保存有当前SIM的发行运营商名称,也就是SPN,该字串可以存储在SIM的EF_SPN(0x6F46)、EF_SPN_CPHS(0x6f14)、EF_SPN_SHORT_CPHS(0x6f18)三个地址上,在SIMRecords初始化时通过getSpnFsm()从SIM中读取出来并保存。下面来看读取SPN的过程:
@SIMRecords.java
protected void fetchSimRecords() {
getSpnFsm(true, null);
}& & & & 请注意,此时的getSpnFsm()的start参数为true,而且mSpnState为初始化值:GetSpnFsmState.IDLE
private void getSpnFsm(boolean start, AsyncResult ar) {
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;
//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;
case READ_SPN_3GPP:
case READ_SPN_CPHS:
case READ_SPN_SHORT_CPHS:
mSpnState = GetSpnFsmState.IDLE;
}& & & & 在上面的过程中,将会从EF_SPN中读取当前SPN,并且将mSpnState置为READ_SPN_3GPP。
& & & & 当读取完毕后,在handleMessage()中读取反馈:
public void handleMessage(Message msg) {
switch (msg.what) {
case EVENT_GET_SPN_DONE:
isRecordLoadResponse =
ar = (AsyncResult) msg.
getSpnFsm(false, ar);
} catch (RuntimeException exc) {
} finally {
if (isRecordLoadResponse) {
onRecordLoaded();
}& & & & 然后再次进入getSpnFsm()中处理,此时的mSpnState状态为READ_SPN_3GPP,而start为false,所以直接进入switch语句判断:
private void getSpnFsm(boolean start, AsyncResult ar) {
if (start) {
switch(mSpnState){
case INIT:
case READ_SPN_3GPP:
if (ar != null && ar.exception == null) {
data = (byte[]) ar.
//设置mSpnDisplayCondition显示标志位,如果通过EF_SPN没有取到,则认为mSpnDisplayCondition=-1
mSpnDisplayCondition = 0xff & data[0];
setServiceProviderName(IccUtils.adnStringFieldToString( data, 1, data.length - 1));
//将当前的SPN写入系统属性
setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, getServiceProviderName());
mSpnState = GetSpnFsmState.IDLE;
mFh.loadEFTransparent( EF_SPN_CPHS, obtainMessage(EVENT_GET_SPN_DONE));
mRecordsToLoad++;
mSpnState = GetSpnFsmState.READ_SPN_CPHS;
mSpnDisplayCondition = -1;
case READ_SPN_CPHS:
case READ_SPN_SHORT_CPHS:
mSpnState = GetSpnFsmState.IDLE;
}& & & & 如果此时从SIM读取的SPN不为空,则会通过adnStringFieldToString()将数据转换为字串后,通过setServiceProviderName()保存,同时也要存储在PROPERTY_ICC_OPERATOR_ALPHA的系统属性中,并且重置mSpnState为IDLE;
& & & & 另外,这里的mSpnDisplayCondition是SPN的第一位数据,在显示SPN时用来判定显示规则。
& & & & 如果SIM中的SPN为空,则再去读取SIM中的EF_SPN_CPHS分区,和上面流程相同,该请求会通过handleMessage()再次发送给getSpnFsm()内部,只不过这次进入READ_SPN_CPHS分支处理:
private void getSpnFsm(boolean start, AsyncResult ar) {
if (start) {
switch(mSpnState){
case INIT:
case READ_SPN_3GPP:
case READ_SPN_CPHS:
if (ar != null && ar.exception == null) {
data = (byte[]) ar.
setServiceProviderName(IccUtils.adnStringFieldToString(data, 0, data.length));
setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, getServiceProviderName());
mSpnState = GetSpnFsmState.IDLE;
mFh.loadEFTransparent( EF_SPN_SHORT_CPHS, obtainMessage(EVENT_GET_SPN_DONE));
mRecordsToLoad++;
mSpnState = GetSpnFsmState.READ_SPN_SHORT_CPHS;
case READ_SPN_SHORT_CPHS:
mSpnState = GetSpnFsmState.IDLE;
}& & & & 与上面读取EF_SPN类似,如果读取成功就保存,否则再去读取EF_SPN_SHORT_CPHS,而读取后的结果一样在getSpnFsm()中处理:
private void getSpnFsm(boolean start, AsyncResult ar) {
if (start) {
switch(mSpnState){
case INIT:
case READ_SPN_3GPP:
case READ_SPN_CPHS:
case READ_SPN_SHORT_CPHS:
if (ar != null && ar.exception == null) {
data = (byte[]) ar.
setServiceProviderName(IccUtils.adnStringFieldToString(data, 0, data.length));
setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, getServiceProviderName());
if (DBG) log(&No SPN loaded in either CHPS or 3GPP&);
mSpnState = GetSpnFsmState.IDLE;
mSpnState = GetSpnFsmState.IDLE;
}& & & & 遇上面流程类似,读取成功就保存,不成功就不再处理。
& & & & 经过上面的过程,就将SIM中的SPN读取并保存起来了。
二、从配置文件读取SPN过程
& & & & Android原始代码中,无论在SIM的三个文件分区有没有查询到SPN,系统都会继续尝试从配置文件中读取SPN,如果读取成功,则覆盖刚才SIM中读取的值,如果配置文件读取失败,就使用上面的SIM中的SPN。
& & & & 开发者可以将所有预置的SPN存入spn-conf.xml这个文件中(不同平台该文件的存储位置不同),在编译时候就会将其拷贝到out的system\etc\目录中,以供系统读取。我们来挑选几条该文件中的项来看一下:
@spn-conf.xml
&spnOverride numeric=&46000& spn=&CHINA MOBILE&/&
&spnOverride numeric=&46001& spn=&CHN-UNICOM&/&
&spnOverride numeric=&46002& spn=&CHINA MOBILE&/&
&spnOverride numeric=&46003& spn=&CHINA TELECOM&/&
&spnOverride numeric=&46007& spn=&CHINA MOBILE&/&
&spnOverride numeric=&46008& spn=&CHINA MOBILE&/&
&spnOverride numeric=&46009& spn=&CHN-UNICOM&/&& & & & 这些项是针对中国区的SPN,我们看到,每一项都包含两个元素,PLMN和SPN,我们可以用当前SIM所驻留的网络的PLMN号码来匹配查找当前的SPN字串。
& & & & 下面我们来看如何将该文件读取到SPN中。
& & & & SIMRecords对象在初始化时,在构造方法里面创建了一个SpnOverride对象:
@SIMRecords.java
public SIMRecords(UiccCardApplication app, Context c, CommandsInterface ci) {
super(app, c, ci);
mSpnOverride = new SpnOverride();
}& & & & 这里的SpnOverride作用就是读取系统预置的SPN列表,我们先来看其初始化流程:
public SpnOverride () {
mCarrierSpnMap = new HashMap&String, String&();
loadSpnOverrides();
private void loadSpnOverrides() {
FileReader spnR
//PARTNER_SPN_OVERRIDE_PATH =&etc/spn-conf.xml&
final File spnFile = new File(Environment.getRootDirectory(), PARTNER_SPN_OVERRIDE_PATH);
spnReader = new FileReader(spnFile);
} catch (FileNotFoundException e) {
Rlog.w(LOG_TAG, &Can not open & + Environment.getRootDirectory() + &/& + PARTNER_SPN_OVERRIDE_PATH);
//解析spn-conf.xml文件
XmlPullParser parser = Xml.newPullParser();
parser.setInput(spnReader);
XmlUtils.beginDocument(parser, &spnOverrides&);
while (true) {
XmlUtils.nextElement(parser);
String name = parser.getName();
if (!&spnOverride&.equals(name)) {
String numeric = parser.getAttributeValue(null, &numeric&);
String data
= parser.getAttributeValue(null, &spn&);
mCarrierSpnMap.put(numeric, data);
spnReader.close();
} catch (XmlPullParserException e) {
Rlog.w(LOG_TAG, &Exception in spn-conf parser & + e);
} catch (IOException e) {
Rlog.w(LOG_TAG, &Exception in spn-conf parser & + e);
}& & & & 这个对象在初始化时就将&etc/spn-conf.xml&文件加载进来,并进行XML解析,把每一项存入mCarrierSpnMap的HashMap中。
& & & & 然后该对象提供了两个查询SPN的方法:
public boolean containsCarrier(String carrier) {
//查询是否包含某个运营商的SPN
return mCarrierSpnMap.containsKey(carrier);
public String getSpn(String carrier) {
//获取某个运营商的SPN
return mCarrierSpnMap.get(carrier);
}& & & & 然后我们接着上一节的介绍,当SIM中的SPN被读取之后,就会在SIMRecords中的handleMessage()消息中收到EVENT_GET_SPN_DONE的消息:
public void handleMessage(Message msg) {
switch (msg.what) {
case EVENT_GET_SPN_DONE:
isRecordLoadResponse =
ar = (AsyncResult) msg.
getSpnFsm(false, ar);
} catch (RuntimeException exc) {
} finally {
if (isRecordLoadResponse) {
onRecordLoaded();
}& & & & 前面我们分析过,在getSpnFsm()中将会对Modem的返回结果进行解析,如果读取成功,就会将SPN字串保存起来,现在我们继续来看如果保存之后,将会进入finally的处理当中,也就是onRecordLoaded()方法:
protected void onRecordLoaded() {
mRecordsToLoad -= 1;
if (mRecordsToLoad == 0 && mRecordsRequested == true) {
onAllRecordsLoaded();
} else if (mRecordsToLoad & 0) {
mRecordsToLoad = 0;
}& & & & 这里的mRecordsToLoad表明当前需要读取的SIM信息条数(SIMRecords初始化过程中需要读取大量的SIM数据),每向Modem发送一条读取的指令,该计数就会加1,当一条记录读取完毕后该计数就会减1,当所有记录全部读取完毕,就会进入onAllRecordsLoaded()的处理:
protected void onAllRecordsLoaded() {
setLocaleFromUsim();
if (mParentApp.getState() == AppState.APPSTATE_PIN || mParentApp.getState() == AppState.APPSTATE_PUK) {
mRecordsRequested =
String operator = getOperatorNumeric();
if (!TextUtils.isEmpty(operator)) {
//保存当前的PLMN
setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, operator);
final SubscriptionController subController = SubscriptionController.getInstance();
subController.setMccMnc(operator, subController.getDefaultSmsSubId());
if (!TextUtils.isEmpty(mImsi)) {
setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, MccTable.countryCodeForMcc(Integer.parseInt(mImsi.substring(0,3))));
log(&onAllRecordsLoaded empty imsi skipping setting mcc&);
//设置当前的语音信箱
setVoiceMailByCountry(operator);
//读取配置文件中的SPN
setSpnFromConfig(operator);
//将通知发送出来
mRecordsLoadedRegistrants.notifyRegistrants( new AsyncResult(null, null, null));
}& & & & 我们来看setSpnFromConfig()的方法:
private void setSpnFromConfig(String carrier) {
if (mSpnOverride.containsCarrier(carrier)) {
//用配置文件中的SPN来作为最终的SPN
setServiceProviderName(mSpnOverride.getSpn(carrier));
SystemProperties.set(PROPERTY_ICC_OPERATOR_ALPHA, getServiceProviderName());
}& & & & 这里就用上mSpnOverride这个对象了,前面我们分析过,他的作用就是把spn-conf.xml文件中的SPN信息解析出来,保存到HashMap中,现在我们需要根据当前的MCC/MNC去该HashMap中寻找匹配的SPN值,并把其作为最终的SPN保存起来。
& & & & 以上就是整个SPN的读取流程,下面用一张逻辑图来展示上述过程:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:204637次
积分:2647
积分:2647
排名:第11315名
原创:56篇
评论:83条
(1)(5)(1)(4)(5)(5)(3)(1)(8)(5)(2)(3)(1)(1)(2)(4)(1)(3)(1)红米手机 &
电视盒子 &
智能硬件 &
看腻了左上角的运营商网标?教你轻松修改
10:17:15&&&来源:Sovereign&&&评论: 点击:
【文章摘要】可能很多人都跟我一样看腻了手机左上角的运营商……所以今天教大家个该运营商的方法
  软件下载请猛击此处:
  可能很多人都跟我一样看腻了手机左上角的运营商&&
  所以今天教大家个该运营商的方法
  1.下载附件MiuiSpnconf.apk并安装到手机上至于如何安装我不用说了吧&
  2.下载百度输入法这个我就不上传了随便哪就能下载
  3.在手机上打开百度输入法
  进入高级设置-管理符号文件-导入符号文件接下来导入附件sym.ini(sym.zip解压)你在随便找个地方用百度输入法输入文字
  点击符号
  在常用、中文符&&那里向下拉会有你想不到的哦
  你没有看错有各式各样的商标(这只是其中一部分,还有其他符号你自己看喽)
  4.接下来进入我们第一步安装好的MiuiSpnconf
  在框框中输入你想要的字符,例如这样&
  这样就完成了
  7.注意请将手机字体改为米兰字体,到主题风格里边可以下载到,如果不是米兰字体,百度输入法的符号可能无法显示
  软件下载请猛击此处:
延伸阅读:
看腻了左上角的运营商网标?教你轻松修改相关评论
版块推荐百宝箱
小米手机ROM
本周推荐度
MIUI 7.2.9
专为宝宝打造的视频应用
一款逗比的外星人
强悍到极致的文件管理器
只要你喜欢 随时能召唤
网购省钱秘笈
小米爆米花
2015年度米粉之星
始终相信美好的事情即将发生!
喜欢唱歌,喜欢搞怪
手机摄影达人
爱玩数码,爱玩手机。
管理版务兢兢业业
热情饱满,服务米粉。
爱收藏,爱小米!
2015追随爆米花走过10个城市
京ICP证110507号 京ICP备号还在为运营商显示英文蛋疼?手把手教你修改运营商!
貌似不少机友都碰到插卡后原来的中文运营商标志改成了英文运营商标志,强迫症发作分分钟的事。。。
福音来了!!!跟着我,手把手教你!
前提请注意:需要解BL锁和OEM锁(防止几率变砖),最好root。
副作用:更改
本教程由@貌似不少机友都碰到插卡后原来的中文运营商标志改成了英文运营商标志,强迫症发作分分钟的事。。。
福音来了!!!跟着我,手把手教你!
前提请注意:需要解BL锁和OEM锁(防止几率变砖),最好root。
副作用:更改分区文件后之后接收Nexus新版本推送会出现在官方Recovery下无法更新机器人倒地,本教程不适用于等待OTA的机友。
1、使用第三方有root可查看系统分区的文件夹。
2、打开/system/etc里的spn-conf.xml。3、按需求把下列代码复制进入尾行&/spnOverrides&前段,& & &spnOverride numeric="46000" spn="中国移动"/&& & &spnOverride numeric="45001" spn="中国联通"/&& & &spnOverride numeric="45002" spn="中国移动"/&& & &spnOverride numeric="45003" spn="中国电信"/&& & &spnOverride numeric="45007" spn="中国移动"/&
4、修改完成后保存,请注意权限默认是644,重启即可预览效果。
1、把下面提供的卡刷包,复制到手机存储内,使用第三方recovery刷入。
2、进入Recovery后选择Install即可刷入。
PS:更新了,之前传的没有对应的修改文件,抱歉~
最后,提示一下,按照卡的类型不一定管用,如果你知道自己运营商的numeric代码可以自行添加,
而且,代码内spn=里的文字是可以更改的哟,发挥你的想象力吧!
PS: 此教程是Nexus4、Nexus5之前在4.4时都可以使用的,之后的版本失效了,
没想到在Nexus 6P上居然可以用。。。
最后发一下修改后的中文运营商效果图!
加pixel中文网官方微信公众账号,扫描下图或者搜索"pixel中文网"关注!
上一篇:下一篇:
原创。。。在贴吧和机锋都发了。
247机情无限
392LG G系列
663机情无限
891智能手表
3014爱谷歌
254822基础入门
178527nexus5教程
159164基础入门
143801进阶玩法
140387进阶玩法
126504Nexus 5
97374Nexus 5
95611nexus5教程
92415基础入门
89002进阶玩法
254822基础入门
178527nexus5教程
159164基础入门
143801进阶玩法
140387进阶玩法
126504Nexus 5
97374Nexus 5
95611nexus5教程
92415基础入门
89002进阶玩法
是为全球所有华人google迷提供交流最新,,,,,,谷歌,安卓资讯,业界科技信息,使用和玩机技巧的科技资讯社交媒体网站
Powered by
nexus中文网QQ群(只加注册用户):(主力群), 8269925,moto x粉丝群1299655【技术】教大家修改运营商信息和透明倒计时_小米2a吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:75,060贴子:
【技术】教大家修改运营商信息和透明倒计时收藏
这个是我的桌面
修改运营商需要MiuiSpnConf 想要输入特殊字符或者商标,比如CCTV的就需要百度输入法了用百度输入法输入以后保存---》打开飞行模式---》关闭飞行模式!然后就OK了
好多童鞋安装以后不会用 这个需要长按桌面,然后在下放选择倒计时的插件
支持一下,不容易
在下来就是对特殊爱好的童鞋了。想要给运营商加符号,加商标的话需要百度输入法,在设置中。商标中导入SYM.INI这个文件地址我还是放在楼中楼吧
------------------教程完结,有不懂的大家回帖问吧!顺便,拿了的童鞋,请帮忙顶贴!
楼主啥字体
支持一个吧
谢谢楼主   ——会心一笑,那是幸福
不容易。楼主辛苦了
小米2a电池上京东!平板满千减百,手机配件买一赠一,好货限时特惠!好物低价,情满数码!京东数码!品类全,折扣狠,送货快,享受愉快购物就上JD.com!
lz....为什么下载的符号,商标栏都是空白的?
楼主的主题是什么
晒自己桌面。   ——    如果你不能应付我最差的一面,那么你也不值得拥有我最好的一面。
顶一下   --来自小米手机
导入了,到没有cctv
这个送给有需要的,做任务就行,最好是无线
求大神,桌面上的字怎么弄
就是你那个沉默是一场斑驳的梦
无聊,没人给顶,自己吧!
lz倒计时插件求私信
 ,     .★ * ★..    .*★ *. *..*  使 ★   ★ 天       ★    *.*    ♥  .. *     ‘★ .     ★’        ‘*..★ ” ✎﹏我是数星星de男孩~~~         这个世界因我而美好!      刚远远隐约看到个人好帅。走近一看。啊他妈的原来是镜子。我立马把镜子砸碎了。草这么帅的人都有,看到我都自卑了
☋                           ~是遇见相伴一生,还是遇见擦身而过。
目测楼主是好人
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 飞凡网 电服务运营商 的文章

 

随机推荐