国码切换流程总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010586698/article/details/59086053

国码切换流程总结

高通平台暗码切换国码流程分析,总共分为三大步骤:

一,首先,电话界面输入暗码,跳转到切换国码界面

1,在电话界面下边输入暗码"####682#",就可以调出切换国码设置界面,具体代码在packages/apps/Dialer/下边的SpecialCharSequenceMgr.java文件中,该暗码定义为:String MMI_SWITCH_COUNTRY_CODE = "####682#",当输入暗码之后会发送一个SECRET_CODE_ACTION广播,同时会将暗码携带上发送出去,关键代码如下:

Intent intent = new Intent(SECRET_CODE_ACTION,

Uri.parse("android_secret_code://" + "682"));

context.sendBroadcast(intent);

该广播也定义在这个文件中,具体为:

String SECRET_CODE_ACTION = "android.provider.Telephony.SECRET_CODE";

2,在packages/apps/Midtest/下边定义了CustomReceiver.java,这个广播接收器对广播"android.provider.Telephony.SECRET_CODE"进行了静态注册,当接收到这个广播之后,通过不同的暗码进行不同的处理,这里打开了Countrycode_select.java这个类,也就是启动国码设置界面,关键代码如下:

if (command.equals("android_secret_code://682")) {

      Intent i = new Intent(Intent.ACTION_MAIN);

      i.setClass(context, Countrycode_select.class);

      i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

      context.startActivity(i);

}

二,其次,在国码界面点击对应的国码进行切换

1,上述步骤中启动了国码设置界面,也就是packages/apps/Midtest/中的Countrycode_select.java,在这个类里边进行了一些界面和国家码的字串的初始化设置,在这其中最关键的字串如下:

<string name="Country41">41-Hong Kong\n香港(HK)</string>,注意:该字串必须严格按照这种格式写,否则会引起数据解析错误等问题。

我们在添加新国码的时候首先应该定义这样一个字串

2,在布局文件countrycode_select.xml中进行对应按钮的设置,在Countrycode_select.java中的btnIds数组中进行按钮的添加。(这也是我们在添加新国码的时候需要修改的文件,在这里边添加对应的按钮。

3,当点击按钮的时候,首先会进行国家码的设置,将国家码写入到NVRAM之中,其次还会判断手机电量的多少,当手机电量高于30%时,才允许进行国码的切换,同时会发送一个(恢复出厂设置)(系统广播)的广播Intent.ACTION_MASTER_CLEAR,并且将countrycodeReason携带发送出去,具体代码如下:

if (mBatteryLevelAllowed == true) {

      Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);

      intent.putExtra(Intent.EXTRA_REASON, countrycodeReason);

      Countrycode_select.this.sendBroadcast(intent);

}

三,最后,手机重启进行对应国码的相应设置

1,系统在frameworks/base中对系统广播Intent.ACTION_MASTER_CLEAR进行了静态注册,以便系统在任何时候都能够接收到恢复出厂设置这一个广播。

2,在frameworks/base/services/core/java/com/android/server下的广播接收器MasterClearReceiver.java接收到这一广播进行相对应的处理,准备进行手机恢复出厂设置之前的一些参数的设置,比如shutdownreasonforcewipe以及wipeExternalStorage等参数,然后进行了恢复出厂设置动作。

3,在手机重启的过程中最为关键的也就是进行对应国家码的一些配置。这些配置需要写入到文件system/core/init/country_info.hxx添加新国码的时候主要进行此文件的配置)中,比如:

{"HK", "zh", "HK", "Asia/Hong_Kong", "1-13", "Default", "yyyy-MM-dd", "9"}注意:配置信息需要严格按照这种格式进行填写,否则会引起一些未知系统错误。

这些配置详细信息如下:

"HK"---------------------------------------code(国家码)

 "zh"---------------------------------------language(默认语言)

"HK"---------------------------------------region(地区)

 "Asia/Hong_Kong"--------------------timeZone(默认时区)

 "1-13"------------------------------------wifiChannelwifi频道)

"Default"----------------------------------fmBand(收音频段)

 "yyyy-MM-dd"--------------------------dateFormat(日期格式)

 "9"------------------------------------------endMatch(电话号码最低匹配位数)

4,在开机的过程中,在init.cpp这个文件中对country_info.hxx里边的配置进行解析,从而进行相应的配置设置。关键代码如下:

{

  const CountryCodeConfig* pConfig = getCountryConfigByCode(propValue);

   property_set("ro.product.locale.language", pConfig->language);

   property_set("ro.product.locale.region", pConfig->region);

   property_set("persist.sys.timezone", pConfig->timeZone);

   property_set("ro.build.phonenumber.minmatch", pConfig->endMatch);

   property_set("ro.phone.wifi_channel", pConfig->wifiChannel);

   property_set("ro.phone.fm_band", pConfig->fmBand);

   property_set("ro.phone.date_format", pConfig->dateFormat);

 }

这样就完成了整个国家码的切换,但是需要注意的是有些国家的需求需要特殊定义,需要与PM沟通具体的需求,再进行一些相关的配置比如应用程序,铃声等,应用程序的配置需要在文件frameworks/base/core/res/xml/countryapk.xml,比如:

<itempackagename="com.estrongs.android.pop"country_ID="RU" action="enable"/>

"com.estrongs.android.pop"---------------------------------------代表应用程序包名

"country_ID="RU"-----------------------------------------------------代表国家码

action="enable"-------------------------------------------------------代表是否需要显示此应用

其他的一些需求需要在代码中通过宏控来控制,代码比如:

if"JP".equals(SystemProperties.get("ro.product.countrycode")

{      //实现自定义需求   }

猜你喜欢

转载自blog.csdn.net/u010586698/article/details/59086053