Android之紧急拨号的处理

  一:Android 紧急拨号的Action
 如果在拨号盘中添加号码然后把此号码作为紧急拨号来使用的话,简单的可以做这样的方式进行处理:
Intent intent = new Intent();
intent.setAction("com.android.phone.EmergencyDialer.DIAL");
startActivity(intent);
  二:关于紧急拨号所引发的问题
针对不同CP平台,不同制式的数据网络,不同的运营商,都有不同的紧急号码,而且在无SIM卡情况下紧急号码是否能拨出也并无定论。当然,现在基本上的手机都已经不支持无卡紧急拨号了,主要原因在运营商,:呵呵
高通平台上面关于紧急拨号的问题如下:
1. CDMA网络
(1)无卡情况下
119/999/120/110均被直接拒绝,无法完成呼叫;
特例:拨打112/911,视各地网络不同而不同,
有的地方cdma网络会不支持,但高通的DSDS方案,会自动切换到GSM网络下完成112呼叫(如:北京);
有的地方的CDMA网络可以完成呼叫(如:厦门);
(2)插卡情况下
119/999/120/110/119,均按照普通电话呼叫成功,包括欠费情况下仍然能呼叫成功;
112 会拨到联通112障碍台
911 提示为空号
2. wcdma网络+GSM网络
(1)无卡情况下
999/120/110/119,均被拒绝
112/911会转到障碍台;
(2)插卡情况下
999/120/110/119,按照正常电话呼叫成功,包括欠费情况下仍然能拨打成功
112/911,会转到障碍台;

  国内的紧急号码在不插sim卡的情况下,实际上都无法打到人工台。这是由于国内并不存在“可以拨打”的紧急号码。通常意义上的紧急号码应该独立于运营商存在,也就是不依赖于SIM卡。但是这种情况在国内是显然不行的,即使在modem侧进行处理,让110、119这类的号码走紧急通话的信道,仍然只能打到障碍台。至于为什么平时拨打紧急号码可以成功,这是因为插着sim卡的时候,并不是走紧急拨号的信道,只是一路普通的呼出电话而已

  三:紧急拨号解决的方法
  在处理这样的问题时,往往在rcclist列表中无法直接进行修改,framework并不是最终决定该紧急号码是否能够拨出去的决定因素(如果该紧急号码并未加入modem平台侧紧急号码的列表中,该号码依然无法拨出),所以解决该问题的方法最好在framework侧直接将紧急号码写为固定的紧急号码,不做过滤处理,都交给Modem来处理
目前项目对紧急号码的支持为:
(高通,G/W)
预置的紧急号码包括:110、112、911、000、08、999、118、119。
(英飞凌,G/EVDO)
预置的紧急号码包括:110、112、911、999、119、120。
Android4.0暂时的解决办法可以是:可以在 /frameworks/base/telephony/java/android/telephony/PhoneNumberUtils.java 中进行修改

 private static boolean isEmergencyNumberInternal(String number, boolean useExactMatch) {
 // If the number passed in is null, just return false:
 if (number == null) return false;
 
 // If the number passed in is a SIP address, return false, since the
 // concept of "emergency numbers" is only meaningful for calls placed
 // over the cell network.
 // (Be sure to do this check *before* calling extractNetworkPortionAlt(),
 // since the whole point of extractNetworkPortionAlt() is to filter out
 // any non-dialable characters (which would turn 'abc911def@example.com'
 // into '911', for example.))
 if (isUriNumber(number)) {
 return false;
 }
 
 // Strip the separators from the number before comparing it
 // to the list.
 number = extractNetworkPortionAlt(number);
 /*
 // retrieve the list of emergency numbers
 // check read-write ecclist property first
 String numbers = SystemProperties.get("ril.ecclist");
 if (TextUtils.isEmpty(numbers)) {
 // then read-only ecclist property since old RIL only uses this
 numbers = SystemProperties.get("ro.ril.ecclist");
 }
 
 if (!TextUtils.isEmpty(numbers)) {
 // searches through the comma-separated list for a match,
 // return true if one is found.
 for (String emergencyNum : numbers.split(",")) {
 if (useExactMatch) {
 if (number.equals(emergencyNum)) {
 return true;
 }
 } else {
 if (number.startsWith(emergencyNum)) {
 return true;
 }
 }
 }
 // no matches found against the list!
 return false;
 }
 */
 // No ecclist system property, so use our own list.
 if (useExactMatch) {
 
 return (number.equals("112") || 
 number.equals("08") ||
 //北美大陆通用报警
 number.equals("911") || 
 //国内大陆紧急号码
 number.equals("110") ||
 number.equals("119") ||
 number.equals("120") ||
 number.equals("122") ||
 //港澳地区报警
 number.equals("000") ||
 //印度地区专用
 number.equals("100") ||
 number.equals("108") ||
 number.equals("101") ||
 //红十字会
 number.equals("999") || 
 //欧洲部分地区报警
 number.equals("118")); 
 } else {
 return (number.startsWith("112") || 
 number.startsWith("08") || 
 //北美大陆通用报警
 number.startsWith("911") ||
 //国内大陆紧急号码
 number.startsWith("110") || 
 number.startsWith("119") || 
 number.startsWith("120") || 
 number.startsWith("122") || 
 //港澳地区报警
 number.startsWith("000") || 
 //印度地区专用
 number.startsWith("100") || 
 number.startsWith("108") || 
 number.startsWith("101") || 
 //红十字会
 number.startsWith("999") ||
 //欧洲部分地区报警
 number.startsWith("118"));
 }
 }

  如果单独的只是添加一些紧急拨号的话,可以在rcclist列表中直接添加(Android5.0),比如我现在添加066作为紧急拨号,处理的路径也是在frameworks/base/telephony/java/android/telephony/PhoneNumberUtils.java
private static boolean isEmergencyNumberInternal(int subId, String number,
                                                     String defaultCountryIso,
                                                     boolean useExactMatch) {
...
// Read from SIM2
        numbers = SystemProperties.get("ril.ecclist1");
        //add by lyj
        numbers += ",066";
....
// Read from SIM3
        numbers = SystemProperties.get("ril.ecclist2");
        //add by lyj
        numbers += ",066";
....
 // Read from SIM4
        numbers = SystemProperties.get("ril.ecclist3");
        //add  by lyj
        numbers += ",066";
....
   String []emergencyNumList = {"122", "066", "120"};
   int eccNo = emergencyNumList.length;
            
    //via support start
     /* "120" should be treated as ECC number for CDMA */
            
    String [] emergencyNumList_cdma = {"122", "066", "120"};
    eccNo = emergencyNumList_cdma.length;
    emergencyNumList = emergencyNumList_cdma;
    Rlog.d(LOG_TAG, "eccNo = " + eccNo + ", last ecc number in emergency num = " + emergencyNumList[eccNo-1]);

 }








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值