遭遇:
遇到這樣一個問題:
使用GSM卡,撥打112時提示各種緊急號碼作用……
使用CMDA卡,撥打112時提示撥打的號碼是空號??
這讓我有點不知所以然,網上找到下面這篇文章,說的很詳細,轉載了。
問題描述
緊急號碼在過去的幾個項目的開發中一直是難下定論的一項問題,原因在於針對不同CP平台,不同制式的數據網絡,不同的運營商,都有不同的緊急號碼,
而且在無SIM卡情況下緊急號碼是否能撥出也並無定論。
常用的緊急號碼中:
911是北美大陸通用報警電話。
08和112是全世界GSM通信網絡共同的標准緊急電話
110,119,120,122是國內大陸的匪、火、急救、交通緊急號碼
118是歐洲部分地區的報警求救電話
999是紅十字會的報警電話
000是港澳地區的報警電話
印度緊急號碼支持:
100 police
112,108 medical
101 file
其中,112與911作為默認的緊急號碼,是被寫入ril.rcclist中。而其它幾個緊急號碼並未加入其中,需要自行寫入該配置文件,
同時modem側需要為其開通特定的緊急號碼撥號通路。
關於需求給出的手機緊急號碼的最終需求定義如下(高通平台):
關於“緊急呼叫”問題,總結下,僅限高通平台:
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,會轉到障礙台;
關於緊急號碼(補1)
國內的緊急號碼在不插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。
暫時的解決辦法可以是:
可以在 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")); //changed by weiyi
}
}
注釋掉對應的過濾段,添加結果即可。
轉載:http://blog.csdn.net/guiyu_1985/article/details/8454413