zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

android预置默认的语音信箱号码具体实现

Android 实现 默认 具体 号码 预置
2023-06-13 09:15:01 时间
有些SIM卡在出厂时并没有预置VoiceMailnumber,但运营商又要求能够根据PLMN去自适应的从手机中读取到预设的VMnumber。在此介绍以xml的方式预置VMnumber的方法,以及如何允许用户去修改并能够记住用户的选择。VMnumber使用的优先级为:SIM卡读取>用户设置>xml预置。在用户修改voicemailnumber时,优先存储到SIM卡。若SIM卡存储失败,则以IMSI为单位存储到手机中。

1、支持以XML的方式预置VMnumber,文件名为:voicemail-conf.xml
文件的内容格式为
复制代码代码如下:

<?xmlversion="1.0"encoding="utf-8"?>
<voicemail>
<voicemailnumeric="46000"carrier="CMCC"vmnumber="10086"vmtag="CMCCvoicemail"/>
</voicemail>

2、关于文件的位置
文件在手机中的位置:system/etc
文件在工程中的位置(GB,GB2):vendor\mediatek\etc
文件在工程中的位置(ICS及以后):mediatek\source\frameworks\telephony\etc
对于GB、GB2的版本,还需要在在build\target\product\xxx.mk(xxx为工程名)中,添加语句PRODUCT_COPY_FILES+=vendor/mediatek/etc/voicemail-conf.xml:system/etc/voicemail-conf.xml
对于ICS及ICS2的版本,还需要在build\target\product\common.mk中,添加语句PRODUCT_COPY_FILES+=mediate/source/frameworks/telephony/etc/voicemail-conf.xml:system/etc/voicemail-conf.xml
对于JB及JB2以后的版本,还需要在build\target\product\common.mk中,添加语句PRODUCT_COPY_FILES+=mediate/frameworks/base/telephony/etc/voicemail-conf.xml:system/etc/voicemail-conf.xml

3、使SIM卡中的VMnumber优先于预置号码的方法
将SIMRecords.java(frameworks\base\telephony\java\com\android\internal\telephony\gsm)中的函数privatesetVoiceMailByCountry(Stringspn)中的语句if(mVmConfig.containsCarrier(spn))修改为
if(TextUtils.isEmpty(voiceMailTag)&&TextUtils.isEmpty(voiceMailNum)&&mVmConfig.containsCarrier(spn))
4、在使用了voicemail-conf.xml来预置VMnumber后,使终端用户可以修改VMnumber的方法
1)在SIMRecords.java中添加语句importandroid.text.TextUtils;
2)在SIMRecords.java中添加一个成员变量booleanisSetByCountry=false;
3)将SIMRecords.java中的函数privatesetVoiceMailByCountry(Stringspn)修改为
复制代码代码如下:

privatevoidsetVoiceMailByCountry(Stringspn){
if(TextUtils.isEmpty(voiceMailTag)&&TextUtils.isEmpty(voiceMailNum)&&mVmConfig.containsCarrier(spn))
{
//isVoiceMailFixed=true;//注释掉此语句以让用户能够修改
isSetByCountry=true;//让GsmPhone知道这是从xml中读取的
voiceMailNum=mVmConfig.getVoiceMailNumber(spn);
voiceMailTag=mVmConfig.getVoiceMailTag(spn);
}

4)在GSMPhone.java(frameworks\base\telephony\java\com\android\internal\telephony\gsm)中的函数handleMessage中的语句caseEVENT_SIM_RECORDS_LOADED:中将语句if(imsi!=null&&imsiFromSIM!=null&&!imsiFromSIM.equals(imsi))
{

}
修改为 
复制代码代码如下:
SharedPreferencessp=PreferenceManager.getDefaultSharedPreferences(getContext());
//当相应卡槽更换SIM卡后,是否清除用户对之前SIM卡的VMnumber设置
booleanclear_if_change_sim=sp.getBoolean(“clear_if_change”,false);
if(clear_if_change_sim&&imsi!=null&&imsiFromSIM!=null&&!imsiFromSIM.equals(imsi)){
//storeVoiceMailNumber(null);
Log.d(LOG_TAT,“resetvmnumberbecausesimchanged”);
SharedPreferences.Editoreditor=sp.edit();
editor.remove(getVmSimImsi());
editor.apply();
setVmSimImsi(null);
}

5)将GSMPhone.java中的函数privatevoidstoreVoiceMailNumber(Stringnumber)中的语句editor.putString(VM_NUMBER+mySimId,number);修改为editor.putString(getSubscriberId(),number);//不再使用卡槽作为保存VMnumber的单位,而使用IMSI
6)将GSMPhone.java中的函数publicStringgetVoiceMailNumber()中的语句if(TextUtils.isEmpty(number))修改为if(TextUtils.isEmpty(number)||((SIMRecords)mIccRecords).isSetByCountry)//如果SIM卡中
//无VMnumber或是通过voicemail-conf.xml来设置的,则应该读取一下Preference,看是否用户
//对此SIM卡设置过VMnumber。
并且将语句number=sp.getString(VM_NUMBER+mySimId,null);修改为
复制代码代码如下:
Log.d(LOG_TAG,vmnumfromsimRecords,num=“+number+”isfromfactory=“+((SIMRecords)mIccRecords).isSetbyCountry);
Stringtemp=sp.getString(getSubscriberId(),null);
if(temp!=null)
{
Log.d(LOG_TAG,“replacevmnumwithuserdefined,num=“+temp);
number=temp;
}