[FAQ14489]Android L SIM卡更新语言问题

[DESCRIPTION]
 
 L上未安装GMS包时, 语言设定情况如下:
 (1)系统预置语言, 即在makefile中指定的语言
 (2)刷机重启, 如果未插卡, 则系统语言为预置的语言
 (3)刷机重启插入SIM卡开机(首次开机), 会自适应为SIM卡的语言, 如首次开机未插入SIM卡, 后面插入SIM卡开机不会再根据SIM卡自适应语言.
 (4) 如果有手动设置语言, 以后开机, 不管插入的是哪个国家的卡, 都会显示设置的语言, 不会根据SIM卡自适应变化.
 
如果首次开机语言未随SIM卡自适应可以参考下面方案解决。
 
[SOLUTION]
 在L上无法通过SIM卡适配语言,或是适配错误语言主要是有下面几个方面原因
1.在Android L 上GOOGLE默认安装了GMS包, GMS包中有去设置语言, 所以SIM卡不能再适配语言。
2.未安装GMS包时SIM卡有时也不能适配语言, 原因是在sim卡去自适应语言时, 系统已设置"device_provisioned"的值为true, 所以sim卡放弃更新。
3.通过MCC和MNC没有在MCCTABLE中没有找到对应的语言。
4.SIMRecords中会去读取SIM卡中的EF文件获取国家CODE和语言CODE去更新语言(而国家CODE和语言CODE是错误的)
 
(目前不能自适应大多数是第1个原因引起, 自适应语言错误大多由第4个原因引起)
 
L上根据sim卡去自适应语言的流程有两路:
(1)sim卡ready时读取mcc(国家码),通过mcc去找其所对应的country code和language code, 然后去更新语言。
(2)如果有设置sim卡PIN码,则从sim卡的EF文件中去读取语言更新。
两路流程对应的流程图分别如下,可对着此图学习一下,遇到问题时可顺着此流程中对应的log一步一步定位。
 
 
(1)对于不能自适应语言的问题,大多是因为安装了GMS包而GMS包中又设置了语言,下图此类型问题的关键log的分析。
从上述分析中可知是因为去设置了语言引起,首次开机中去设置了语言很可能是GMS做的,可去掉GMS包验证下,如去掉之后能自适应则说明是GMS包做的了,原则上如果去设置了语言就不能再去自适应,但对这种情况可以做如下修改:
      private static boolean canUpdateLocale(Context context) {
            return !(userHasPersistedLocale() || isDeviceProvisioned(context));
      }
修改为
private static boolean canUpdateLocale(Context context) {
     return !(userHasPersistedLocale()  && isDeviceProvisioned(context));
}
 
 
(2)如果经过上面步骤还是无法适配到对应的语言,同时出现以下LOG,说明是因为不能根据mcc从MccTable中找不到对应的country code和language code导致的不能自适应。
    MccTable: updateMccMncConfiguration: mcc=460, mnc=1 (根据SIM 卡不同)

    MccTable: getLocaleForLanguageCountry: got a language-only match: de-AT 

    (这个LOG 表示在sTable中无法根据SIM卡的MCC获取国家码和语言码)
   可修改mcctable中的sTable 
   如 sTable.add(new MccEntry(460,"cn",1,"zh"));  //China (People's Republic of)
   可以参考FAQ06189 插国外SIM卡,第一次开机语言没有自适应
   同时将
if (firstMatch == null) {
           firstMatch = l;
        }屏蔽掉
 
 (3).对于根据sim卡自适应语言错误的问题。大多是因为设置PIN锁后从sim卡的EF文件去读取语言更新引起的,sim卡的EF文件中一般写入的是这个sim卡所属国家的语言,但有些坏的sim卡写入的是其它国家的语言,就会有这种问题(这种类型问题的现象是只在少数sim卡上出现自适应语言错误的问题,而其他sim卡自适应语言正常)。
 
     查看Syslog有以下LOG打出
MccTable: setSystemLocale: updateLocale config={1.0 ?mcc?mnc de_AT ldltr ?swdp ?wdp ?hdp ?density ?lsize ?long ?orien ?uimode ?night ?touch ?keyb/?/? ?nav/?}
    同时Radiolog中有如下log打出
  SIMRecords: [SIMRecords] languages from sim = de (slot 0)
  SIMRecords: [SIMRecords] Setting locale to de_null (slot 0)
     则可断定是从Sim卡中EF文件中读取语言去更新的。

可如下修改:
SIMRecords.java中
handleMessage方法中注释掉如下语句:
case EVENT_APP_LOCKED:
//    onLocked();             //注释掉此语句从而关掉从SIM卡获取优先语言的feature
 
 
 
comment:
对于手机插入双卡的情况,首次开机不能确定自适应为哪一张的语言,与sim卡的初始化速度等有关,哪一张卡先ready就先读哪张卡的IMSI去获得mcc mnc自适应语言,这是default design. 如果对于这种情况想要每次都自适应为第一张卡的语言,可参考如下设计思想:
   在根据Sim卡更新语言的地方加上条件,只有在当前插入两张卡并且当前卡是卡1的情况下才去更新。
  (1)判断是否两张卡:可根据SubscriptionManager.java的接口getActiveSubscriptionInfoCount()得到。
         (2)判断是否卡1:可根据如下获得subId, subId为0表示卡1为1表示卡2.
  int subId = SubscriptionManager.getSubIdUsingPhoneId(mParentApp.getPhoneId);

         (3)sim卡更新语言调用的接口是SimRecords.java中的updateConfiguration();在调用它的地方加上条件。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值