在<<Emulator默认电话号码和MCC,MNC的修改>>中已经知道了模拟器的MCC,MNC是如何修改的. 但是修改后是有一个问题的.即模拟器无法联网了. 主要问题是在哪里呢?
首先我们要知道手机SIM卡中是存储了国际移动用户识别码的就是我们常说的IMSI, 这串数字用于区别移动用户的有效信息. 其总长度一般为15位, 前面的三位就是MCC即国家代码. 如:中国的460 美国的310等. 那么MNC就是 第4位到第6位 . 中国的MNC是两位的所以IMSI 的前5位就是MCCMNC. 美国的MNC是三位,所以IMSI 的前6位就是MCCMNC. 模拟器默认的就是美国的MCCMNC. 即310260.
那么当手机插入SIM后是如何确定MNC的位数的呢? 毕竟手机需要根据MCC和MNC来确定apn好接入到对应的网络上网的.首先获取IMSI 是这样的. 在emulator 模拟器的源码中有 qemu/android/android-emu/android/telephony/modem.c 这个文件. 其中有下面这么一段
//原本的代码中 第二项是有数据的 就是相应的IMSI 和IMEI
// 我修改成通过后面的方法来获取相应的数据
{ "+CIMI", NULL, handleGetImsi },
{ "+CGSN", NULL, handleGetImei },
这一段是通过AT指令来获取相应的IMSI 和IMEI的.
同样在/telephony文件夹下有一个文件 sim_card.c 文件 有这么一段.
{ "+CRSM=176,28589,0,0,4", "+CRSM: 144,0,00000002" }, //Change MNC Length to 2
这一段命令是通过AT指令 来确定MNC的长度的 原本最后的一个数字是3.即MNC的长度截取3位. 因为emulator默认MCC是美国的310 所以MNC截取为3位. 现在我们改成2位,这样 framework中就会截取MNC的长度就是两位了.
确定了MCCMNC的长度后,我们就可以把apns-conf.xml 修改后打包进rom中了. 注意: 原有的aosp中apns-conf.xml 是不包含 其它国家的MCCMNC的. 我们可以将真机的 /system/etc/apns-conf.xml pull出来 打包进rom中 这样apn的接入点就是 国内的移动网络代码了. 同样我们将真机的 /system/etc/spn-conf.xml pull出来打包进rom中. 这样 运营商的名字就会根据这个配置文件来确定了.
另外 记得将 emulator 中 Cellular 设置项中的NetworkType 选为LTE 然后 重置 apn 就可以上网了.
通过 adb shell getprop 查看gsm.sim 的相关属性 发现都变了!!.