当前位置: 移动技术网 > IT编程>移动开发>Android > android预置默认的语音信箱号码具体实现

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

情侣热吻无视抢劫,妆容圣手,邓卓翔近况

有些sim卡在出厂时并没有预置voicemail number,但运营商又要求能够根据plmn去自适应的从手机中读取到预设的vm number。在此介绍以xml的方式预置vm number的方法,以及如何允许用户去修改并能够记住用户的选择。vm number使用的优先级为: sim卡读取>用户设置>xml预置。在用户修改voice mail number时,优先存储到sim卡。若sim卡存储失败,则以imsi为单位存储到手机中。

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

<?xml version='1.0' encoding='utf-8'?>
<voicemail>
<voicemail numeric="46000" carrier="cmcc" vmnumber="10086" vmtag="cmcc voicemail" />
</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卡中的vm number优先于预置号码的方法
将simrecords.java (frameworks\base\telephony\java\com\android\internal\telephony\gsm)中的函数private setvoicemailbycountry(string spn)中的语句if (mvmconfig.containscarrier(spn))修改为
if (textutils.isempty(voicemailtag) && textutils.isempty(voicemailnum) && mvmconfig.containscarrier(spn))
4、在使用了voicemail-conf.xml来预置vm number后,使终端用户可以修改vm number的方法
1) 在simrecords.java中添加语句import android.text.textutils;
2) 在simrecords.java中添加一个成员变量boolean issetbycountry = false;
3) 将simrecords.java中的函数private setvoicemailbycountry(string spn)修改为
复制代码 代码如下:

private void setvoicemailbycountry(string spn) {
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中的语句case event_sim_records_loaded:中将语句 if (imsi != null && imsifromsim != null && !imsifromsim.equals(imsi))
{

}
修改为 
复制代码 代码如下:

sharedpreferences sp = preferencemanager.getdefaultsharedpreferences(getcontext());
// 当相应卡槽更换sim卡后,是否清除用户对之前sim卡的vm number设置
boolean clear_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, “reset vm number because sim changed”);
sharedpreferences.editor editor = sp.edit();
editor.remove(getvmsimimsi());
editor.apply();
setvmsimimsi(null);
}

5) 将gsmphone.java中的函数private void storevoicemailnumber(string number)中的语句editor.putstring(vm_number+mysimid, number);修改为editor.putstring(getsubscriberid(), number); //不再使用卡槽作为保存vm number的单位,而使用imsi
6) 将gsmphone.java中的函数public string getvoicemailnumber()中的语句if (textutils.isempty(number))修改为 if (textutils.isempty(number) || ((simrecords)miccrecords).issetbycountry) //如果sim卡中
//无vm number或是通过voicemail-conf.xml来设置的,则应该读取一下preference,看是否用户
//对此sim卡设置过vm number。
并且将语句number = sp.getstring(vm_number+mysimid, null);修改为
复制代码 代码如下:

log.d(log_tag, vm num from simrecords, num= “+number+” is from factory= “+ ((simrecords)miccrecords).issetbycountry);
string temp = sp.getstring(getsubscriberid(), null);
if (temp != null)
{
log.d(log_tag, “replace vm num with user defined, num= “+temp);
number = temp;
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网