MTK_FAQ_Telephony - Phone
来源:互联网 发布:国密算法实现 编辑:程序博客网 时间:2024/06/07 03:29
内容
public void addNotification(StatusBarNotification notification, RankingMap ranking) { if (DEBUG) Log.d(TAG, "addNotification key=" + notification.getKey()); /// M: for ALPS02303269. @{ boolean isInCallNotification = (notification.getPackageName() != null) && notification.getPackageName().equals("com.android.dialer"); /// @} if (mUseHeadsUp && shouldInterrupt(notification) /// M: for ALPS02303269. @{ && !isInCallNotification /// @} ) { ...........................; } .................................;}
File: frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBar.java
/// M: turn off HeadsUp for dialer. @{ private final String PACKAGES_DIALER = "com.android.dialer";/// @}@Overridepublic void addNotification(StatusBarNotification notification, RankingMap ranking) { /// M: turn off HeadsUp for dialer. @{ boolean belongsToDialer = PACKAGES_DIALER.equals(notification.getPackageName()); if (DEBUG) { Log.d(TAG, "addNotification key=" + notification.getKey() + ", package=" + notification.getPackageName()); } if (!belongsToDialer && /// @} mUseHeadsUp && shouldInterrupt(notification)) { if (DEBUG) Log.d(TAG, "launching notification in heads up mode"); Entry interruptionCandidate = new Entry(notification, null); ViewGroup holder = mHeadsUpNotificationView.getHolder(); if (inflateViewsForHeadsUp(interruptionCandidate, holder)) { // 1. Populate mHeadsUpNotificationView mHeadsUpNotificationView.showNotification(interruptionCandidate); // do not show the notification in the shade, yet. return; } } .................................;}
[DESCRIPTION]
C2K项目上Conference Call的介绍。
[SOLUTION]
C2K项目上,Conference Call分为两种:
- Three-Party Call
- Call Waiting
两者是以第二通Call做区分的:
如果第二通Call是MO,也就是主动发起的Call,那么这种情况就是Three-Party Call。
如果第二通Call是MT,也就是接通一通来电,这种情况就属于Call Waiting。
对于Three-Party Call来说,在第二通call接通后,通话界面上只允许做Merge操作,而不允许做Swap操作(Spec规定),也不可以单独断掉任何一方。Merge之后,通话三方彼此可以听到任意一方的通话内容。如果按界面上的END,会挂掉所有电话。
注意:如果第二通call接通后,不做Merge的话,第一通call是无法切为Active,一直为Hold状态,因为这种情况下没有Swap功能。
对于Call Waiting,当接通来电后,只可以进行swap,也就是active call和hold call状态互相切换,而不可以做Merge操作,同样也不可以单独断掉任何一方。当按界面上的END,同样会挂掉所有电话。
想了解更多,可参考Spec:3GPP2 C.S0005-0
中的
Figure B-5. Simple Call Flow, Three-Party Calling Example
Figure B-6. Simple Call Flow, Call-Waiting Example
private void initAccountList() { List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList(); if (sil == null) { return; } for (SubscriptionInfo subscription : sil) { Log.d(LOG_TAG, "initAccountList() MTK subscription.getDisplayName():" + subscription.getDisplayName());//Add log Log.d(LOG_TAG, "initAccountList() MTK subscription.getNumber():" + subscription.getNumber());//Add log CharSequence label = subscription.getDisplayName() +":" + subscription.getNumber() ;//MTK Edit for distinguish same operator Intent intent = new Intent(TelecomManager.ACTION_SHOW_CALL_SETTINGS); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); SubscriptionInfoHelper.addExtrasToIntent(intent, subscription); Preference accountPreference = new Preference(getActivity()); accountPreference.setTitle(label); accountPreference.setIntent(intent); mAccountList.addPreference(accountPreference); }}
Note:而亮屏状态下,长按蓝牙耳机的send key,则会弹出选择SIM卡的界面,如果选择则可以正常呼出;
而由于InCall和Telecom的交互结构所限,选卡界面在遇到onPause时必须断call,进而退出UI。这个过程发生得很快,用户就难以看到选卡界面先show出来,再消失掉这个过程。
【前提条件】插双卡
【操作步骤】
1.拨号盘,输入号码进行拨号
[Root Cause]
这个是Normal Design!
1、 目的是当前有active call的情况下 incoming call(waitting call) 不要播放来电铃声,而改用call waitting tone 提示用户即可。 设计的初衷是不要播铃声而disturb到当前正在进行的通话。
2、这里弹出选账号的界面,我们认为用户当前要进行一次MO的动作,这个时候MO出去的这通call是foreground call 优先级是最高的,所以我们把这种情况和InCall的情况一样的处理方式,这时候不会播放来电铃声,而只会播call waitting tone.
[SOLUTION]
如果贵司希望改进的话,可以参照如下solution:
Ringer.java的 startRingingorCallWaitting() 方法修改如下code:
...... }else if(foregroundCall != null){ //加入下边这一行 if(foregroundCall.getState() == CallState.PRE_DIAL_WAIT) { return ;} ...... } ......
[Android Version]
Android V2.3 (GB,GB2,GB3)
Android V4.0, 4.1,4.2,4.3,4.4(ICS,ICS2,JBJ,B2,JB3,JB5,KK1,KK1.MP1,KK1.MP3)
Android V5.0,5.1(L0,L1)
[DESCRIPTION]
拨号过程中显示“Unknown Caller”
[SOLUTION]
if (conn == null) { // TODO if (DBG) log(" Connnection is null"); return; } else {修改为if (conn == null) { // TODO if (DBG) log(" Connnection is null"); return; } else if (!TextUtils.isEmpty(number)) {//仅当号码不为空时才更新号码
case SuppCrssNotification.CRSS_CONNECTED_LINE_ID_PREST: //Eidt for ALPS02140502 //if (mOriginalConnectionState == Call.State.ACTIVE) { // notifyNumberUpdate( // PhoneNumberUtils.stringFromStringAndTOA(noti.number, noti.type)); //} //ALPS02140502 End break;default: break;
2. GsmConnection.java(frameworks/opt/telephony/src/.../gsm)-->update()
update (DriverCall dc) { GsmCall newParent; boolean changed = false; boolean wasConnectingInOrOut = isConnectingInOrOut(); boolean wasHolding = (getState() == GsmCall.State.HOLDING); newParent = parentFromDCState(dc.state); //Ignore dc.number and dc.name in case of a handover connection if (mOrigConnection != null) { if (Phone.DEBUG_PHONE) log("update: mOrigConnection is not null"); } else { //Eidt for ALPS02140502 log(" mNumberConverted " + mNumberConverted); log(" mAddress: " + mAddress);//Add Log log(" dc.number: " + dc.number);//Add Log if (mAddress.isEmpty()&& !equalsHandlesNulls(mAddress, dc.number) && (!mNumberConverted || !equalsHandlesNulls(mConvertedNumber, dc.number))) { log("update: phone # changed!"); mAddress = dc.number; changed = true; } } //ALPS02140502 End .......}
三, L1版本修改如下:
case SuppCrssNotification.CRSS_CONNECTED_LINE_ID_PREST: originalConnection = getOriginalConnectionWithState(phone, Call.State.ACTIVE); connection = findConnection(originalConnection); if (connection != null) { if (forceConn == null || forceConn == connection) { Log.v(LOG_TAG, "onCrssSuppServiceNotification() edit for disable CLIP!"); //connection.notifyNumberUpdate(PhoneNumberUtils.stringFromStringAndTOA( // noti.number, noti.type)); } } else { if (forceConn == null) { Log.v(LOG_TAG, "onCrssSuppServiceNotification()...connection is null"); addCrssnList(noti, phone); } } break;
1. InCallPresenter.java
a. 增加以下引用
......
import android.os.PowerManager;// Add For synchronize ringer and UI
b. 增加方法 playIncomingCallRingtone(android.telecom.Call call)
/** * Add For synchronize ringer and UI * * @param call */ public void playIncomingCallRingtone(android.telecom.Call call){ Log.i(this, "playIncomingCallRingtone()"); TelecomAdapter.getInstance().playIncomingCallRingtone(call); }
c. 修改onIncomingCall(Call call)方法
public void onIncomingCall(Call call) { //begin Add For synchronize ringer and UI PowerManager pm = null; pm = (PowerManager)getSystemService(Context.POWER_SERVICE); //end Add For synchronize ringer and UI InCallState newState = startOrFinishUi(InCallState.INCOMING); InCallState oldState = mInCallState; Log.i(this, "Phone switching state: " + oldState + " -> " + newState); mInCallState = newState; //begin Add For synchronize ringer and UI Log.d(this, "onIncomingCall the screen is on ? ----- " + pm.isScreenOn()); if(pm.isScreenOn()){ Log.d(this, "onIncomingCall the screen is on!"); playIncomingCallRingtone(call.getTelecommCall()); } //end Add For synchronize ringer and UI for (IncomingCallListener listener : mIncomingCallListeners) { listener.onIncomingCall(oldState, mInCallState, call); } }
2. TelecomAdapter.java中增加方法playIncomingCallRingtone(android.telecom.Call call)
//Add For synchronize ringer and UIvoid playIncomingCallRingtone(android.telecom.Call call) { if (mPhone != null) { Log.d(this, "playIncomingCallRingtone() Call:" + call); if (call != null) { call.playIncomingCallRingtone(); } else { Log.e(this, "error playIncomingCallRingtone, call is null"); } } else { Log.e(this, "error playIncomingCallRingtone, mPhone is null"); } }
3. Call.java(frameworks\base\telecomm\java\android\telecom)增加方法playIncomingCallRingtone():
//Add For synchronize ringer and UI public void playIncomingCallRingtone() { mInCallAdapter.playIncomingCallRingtone(); }
4. InCallAdapter.java(frameworks\base\telecomm\java\android\telecom)增加方法playIncomingCallRingtone():
/** * Add For synchronize ringer and UI * */ public void playIncomingCallRingtone() { try { mAdapter.playIncomingCallRingtone(); } catch (RemoteException e) { } }
5. IInCallAdapter.aidl(frameworks\base\telecomm\java\com\android\internal\telecom)文件中增加接口:
void playIncomingCallRingtone();
6. InCallAdapter.java(packages\services\telecomm\src\com\android\server\telecom)
1> 增加静态成员:
//Add For synchronize ringer and UI
private static final int MSG_PLAY_INCOMING_RINGTONE = 1008;
2> InCallAdapterHandler的handleMessage()方法的最后添加:
case MSG_PLAY_INCOMING_RINGTONE:
mCallsManager.playIncomingCallRingtone();
break;
3> 添加成员方法:
@Override
public void playIncomingCallRingtone() {
mHandler.obtainMessage(MSG_PLAY_INCOMING_RINGTONE).sendToTarget();
}
7. CallsManager.java 中增加方法playIncomingCallRingtone()
//Add For synchronize ringer and UI
public void playIncomingCallRingtone(){
Log.v(this, "playIncomingCallRingtone()");
mRinger.startRingingOrCallWaiting();//修改该方法为Public
}
8. Ringer.java(packages\services\telecomm\src\com\android\server\telecom)中修改onForegroundCallChanged()方法如下:
@Override public void onForegroundCallChanged(Call oldForegroundCall, Call newForegroundCall) { if (mRingingCalls.contains(oldForegroundCall) || mRingingCalls.contains(newForegroundCall)) { // Add For synchronize ringer and UI Log.v(this, "synchronize onForegroundCallChanged() "); //End //Original code //updateRinging(); } }
9. InCallactivity.java
a. 增加以下引用
......
import android.os.PowerManager;// Add For synchronize ringer and UI
b. 增加以下成员
...... //begin Add For synchronize ringer and UIprivate PowerManager pm = null; private boolean mIsHadStop = false;//end Add For synchronize ringer and UI
c.
protected void onCreate(Bundle icicle) { Log.d(this, "onCreate()... this = " + this); super.onCreate(icicle);...... //begin Add For synchronize ringer and UI pm = (PowerManager)getSystemService(Context.POWER_SERVICE); Log.d(this, "AAAscreen is on ? ----- " + pm.isScreenOn()); //end Add For synchronize ringer and UI Log.d(this, "onCreate(): exit"); }
d.
protected void onResume() {......InCallPresenter.getInstance().lightOnScreenForSmartBook(); //begin Add For synchronize ringer and UIfinal Call call = CallList.getInstance().getIncomingCall();Log.d(this, "onResum:call: " + call);if(call != null){ Log.d(this, "BBBscreen is on ? ----- " + pm.isScreenOn()); if((call.getState() == Call.State.CALL_WAITING) ||((call.getState() == Call.State.INCOMING)&&(pm.isScreenOn()&&mIsHadStop))){ InCallPresenter.getInstance().playIncomingCallRingtone(call.getTelecommCall()); mIsHadStop = false; }} //end Add For synchronize ringer and UI }
e.
protected void onStop() { Log.d(this, "onStop()..."); …………… super.onStop(); mIsHadStop = true; // Add For synchronize ringer and UI }
[Android Version]
Android V2.3 (GB,GB2,GB3)
Android V4.0, 4.1(ICS,ICS2,JB)
Android V4.2及之后版本(JB2,JB3,JB5,KK1,KK2)
Android V5.0及之后版本(L0,L1)
[DESCRIPTION]
如何进行Clear Code客制化。
[SOLUTION]
Clear code会由CEER这个AT Command上报给RIL,虽然所有的Clear code都会报到RIL层,但值大于127的Clear code都被映射为UNSPECIFIED了。所以Telephony Framework这边只能客制化小于127的Clear code。
目前平台上面已经在CallFailCause.java (alps\frameworks\base\telephony\java\com\android\internal\telephony\gsm)这个文件中为很多常见的Clear code定义了常量,如仍有需要,可再增加。
以添加Clear code为8的情况为例,步骤如下:
一 GB、ICS、JB版本修改如下:
1、在CallFailCause.java (
android V4.4之前版本:alps\frameworks\base\telephony\java\com\android\internal\telephony\gsm
android V4.4及之后版本:
alps\frameworks\opt\telephony\java\com\android\internal\telephony\gsm
)
中添加:
static final int OPERATOR_DETERMINED_BARRING = 8;
2、在Connection.java
(android V4.4之前版本:alps\frameworks\base\telephony\java\com\android\internal\telephony
android V4.4及之后版本:
alps\frameworks\opt\telephony\java\com\android\internal\telephony)中的DisconnectCause枚举中添加OPERATOR_DETERMINED_BARRING
3、在(
android V4.4之前版本:alps\frameworks\base\telephony\java\com\android\internal\telephony\connection.java
android V4.4及之后版本:alps\frameworks\opt\telephony\java\com\android\internal\telephony\Gsmconnection.java)中的disconnectCauseFromCode(int causeCode)方法中的swtich(causeCode)中添加
case CallFailCauseOPERATOR_DETERMINED_BARRING:
return DisconnectCause.OPERATOR_DETERMINED_BARRING;
4、
android V4.4之前版本:
在InCallScreen中的onDisconnect(AsyncResult r , int msg)方法中添加UI收到信息后的行为,例如显示一个Toast:
} else if (cause == Connection.DisconnectCause.OPERATOR_DETERMINED_BARRING) {
showToast(String string)); //此处也可以修改为其他行为
return;
android V4.4及之后版本:
在incallActivity中的getResIdDisconnectionCause(Call.DisconnectionCause cause)方法中添加UI收到信息后的行为即可。
二 KK版本修改如下:
1、在CallFailCause.java (alps\frameworks\opt\telephony\src\java\com\android\internal\telephony\gsm)中添加 static final int OPERATOR_DETERMINED_BARRING = 8;//自定义名称
2、在Call.java (alps\packages\services\telephony\common\src\com\android\services\telephony\common) 中的DisconnectCause枚举中添加OPERATOR_DETERMINED_BARRING
3、在Connection.java (alps\frameworks\opt\telephony\src\java\com\android\internal\telephony)中的DisconnectCause枚举中添加OPERATOR_DETERMINED_BARRING
4、在GsmConnection.java (alps\frameworks\base\telephony\java\com\android\internal\telephony\gsm)中的disconnectCauseFromCode(int causeCode)方法中的swtich(causeCode)中添加
case CallFailCause.OPERATOR_DETERMINED_BARRING:
return DisconnectCause.OPERATOR_DETERMINED_BARRING;
5、在CallModeler.java(alps\packages\services\telephone\src\com\android\phone)中的成员变量CAUSE_MAP中增加:
.put(Connection.DisconnectCause. OPERATOR_DETERMINED_BARRING,
Call.DisconnectCause. OPERATOR_DETERMINED_BARRING)
6、在InCallActivity.java中的getResIdForDisconnectCause() 增加:
else if (cause == Call.DisconnectCause. OPERATOR_DETERMINED_BARRING) {
resId = R.string.XXX;//客制化添加要显示的String
}
三 L版本修改如下:
1、在CallFailCause.java (alps\frameworks\opt\telephony\src\java\com\android\internal\telephony\gsm)中添加静态成员变量:static final int OPERATOR_DETERMINED_BARRING = 8;//自定义名称
2、在DisconnectCause.java (alps\frameworks\base\telephony\java\android\telephony)中添加静态成员变量:static final int OPERATOR_DETERMINED_BARRING,并在其复写的toString()中添加相应的Case分支。
3、在GsmConnection.java (alps\frameworks\opt\telephony\src\java\com\android\internal\telephony\gsm)中的disconnectCauseFromCode(int causeCode)方法中的swtich(causeCode)中添加:
case CallFailCause.OPERATOR_DETERMINED_BARRING:
return DisconnectCause.OPERATOR_DETERMINED_BARRING;
4、在DisconnectCauseUtil.java (alps\packages\services\telephony\src\com\android\services\telephony)中的
toTelecomDisconnectCause()函数中会调用其内部如下函数:
toTelecomDisconnectCauseCode(),// # cause code归类,与第五步的判断对应
toTelecomDisconnectCauseLabel(),
toTelecomDisconnectCauseDescription(),//# 展示给用户的断开描述
toTelecomDisconnectReason(),
toTelecomDisconnectCauseTone()
请根据需要在上述函数中加入(#项为必须添加)
case CallFailCause.OPERATOR_DETERMINED_BARRING://分支
5、在InCallActivity.java (alps\packages\apps\incallui\src\com\android\incallui)中的maybeShowErrorDialogOnDisconnect()函数中会根据Code值以及断开Description等来决定是否显示对话框提示,代码如下:
另外,关于Clear code的具体含义,可以去3GPP Spec TS24.008的Annex H中去查找。
附加说明:
对于Clear Code从RILD上报到RILJ是否对其值有修改可以通过查看Radio Log来确定:
03-02 20:41:57.311 641 644 D use-Rlog/RLOG-RIL: MD fail cause = 8
03-02 20:41:57.311 641 644 D use-Rlog/RLOG-RIL: RIL fail cause = 21
如果MD和RIL的值不一致,例如值为8,请修改ril_cc.c文件(alps/mediatek/hardware/ril/mtk-ril/ril_cc.c)中的函数requestLastCallFailCause():
if (callFailCause == 10 || callFailCause == 8)修改为:if (callFailCause == 10)。
2. 问题2:通话过程中去设置时间,通话计时时间会变的问题。
二、如果只须解决问题2,L0版本请参考如下修改:
2. StatusBarNotifier.java (packages\apps\incallui\src\com\android\incallui)
3. Call.java (packages\services\telecomm\src\com\android\server\telecom)
4. CallLogManager.java(注:logCall()函数如果没有ALPS01887060 Patch的请自行添加,如第一条所述,如果有请按照标识处修改即可)
5. CallsManager.java(注:notifyCdmaCallAccepted函数为C2K项目才有)
三、如果是L1版本,解决问题2请参考如下修改:
1. Call.java(packages\services\Telecomm\src\com\android\server\telecom)
2. CallCardPresenter.java(packages\apps\incallui\src\com\android\incallui)
[DESCRIPTION]
紧急号码的客制化分为AP(android)端和modem端两部分。以下是Smartphohe平台上拨号的一个逻辑流程.
[SOLUTION]
根据上述拨号逻辑流程,可知:
【Ⅰ】如果一个紧急号码要求不管在什么情况下,都以“紧急方式呼出”,则可采取如下两种修改方法:
a.只修改AP部分,即:AP端采取“紧急式呼叫”便可。
b.修改AP和Modem两部分。AP端采用“非紧急式呼叫”进行客制化,而Modem端的客制化请参考如下Modem部分的修改。
【Ⅱ】如果一个紧急号码要求在手机有卡时,以“普通方式呼出”,在无卡时,以“紧急方式呼出”,则可采取如下修改方法:
a. 修改AP和Modem两部分。AP端采用“非紧急式呼叫”进行客制化,而Modem端的客制化请参考如下Modem部分的修改。
※ 以下以添加“102”紧急号码为例(GB, GB2, ICS, ICS2版本可直接参考如下修改,而JB及以上版本,还要同时留意该文档中“注意事项”部分的修改说明):
A.修改AP部分:
说明:
AP端是否采用“紧急式呼叫”,它的判断条件是定义在如下方法中:
Connection dial(String dialString, ...)方法是定义在framework\base\telephony
\java\com\android\internal\telephony\gsm\GsmCallTracker.java文件中。
从上述代码逻辑,可知:
★ AP端采用“紧急式呼叫”,其修改方法如下(红框标识的地方):
a.修改framework\base\telephony\java\android\telephony\
PhoneNumberUtils.java中的isEmergencyNumber(...)方法,使其返回为true。
Public static boolean isEmergencyNumber(String num)
{
......
......
b. 修改framework\base\telephony\java\android\telephony\
PhoneNumberUtils.java中的isSpecialEmergencyNumber (...)方法,使其返回为false.
注:以上方法中并没判断“102”号码,已满足返回值为false的条件,暂不用修改。
★ AP端采用“非紧急式呼叫”,其修改方法如下(红框标识的地方):
a.修改framework\base\telephony\java\android\telephony\
PhoneNumberUtils.java中的isEmergencyNumber(...)方法,使其返回为true。
Public static boolean isEmergencyNumber(String num)
{
......
......
b. 修改framework\base\telephony\java\android\telephony\
PhoneNumberUtils.java中的isSpecialEmergencyNumber (...)方法,使其返回为true.
B.修改Modem部分:
如果AP端是采用“紧急式呼叫”,则Modem部分不用修改;如果AP端是采用“非紧急式呼叫”,则必须修改Modem部分。
1.如果AP端是采用“非紧急式呼叫”,则Modem部分的修改如下(红框标识的地方):
a.修改custom\common\custom_ecc.c文件中的数组ecc_default_num。
注:
前四个uint16是号码,以0x0000结尾,第5个uint16是参数,“1”表示此号码始终以紧急方式呼出;“0”表示此号码在手机有卡时,以普通方式呼出,无卡时,以紧急方式呼出。
※ 注意事项
1.客制化紧急拨号功能时,注意不同软件版本的区别:
A.对于GB, GB2, ICS, ICS2这四个版本,请直接参考上述修改方法.
B.对于GB3,JB,JB3及以上版本,由于在phoneNumberUtils.java文件中,对isSpecialEmergencyNumber(..)和isEmergencyNumber(…)方法定义有所改变,如下(红色框标识差异的地方):
……
……
}
针对以上不同点,在客制化紧急号码时,请采取如下方式去修改以上两方法的不同点:
(1)先查看mediatek\operator\Opxxx(OP01、OP02、。。。)\frameworks\java\com
\mediatek\op\telephony目录下是否有PhoneNumberExtOPxxx.java文件,如有,就直接修改此文件就行,否则就修改mdiatek\frameworks\base\op\java\com\mediatek\op\telephony目录下的PhoneNumberExt.java文件。
(2)针对PhoneNumberExtOPxx.java文件或PhoneNumberExt.java文件,如有如下方法,请按下述方式修改(红色框标识修改的地方):
注:
在以上方法中客制化需要设定为紧急号码的号码。此方法用于判断某个号码是否需要设定为紧急号码,作用同JB之前版本的PhoneNumberUtils.isEmergencyNumber(…)方法中的emergencyNumberList数组.
注:
此方法含义同JB之前版本的PhoneNumberUtils.java中的isSpecialEmergencyNumber方法。
※ 附加更新(KK2、L版本说明)
KK2、 L版本紧急号码Customer的部分改成了在XML文件中来配置,文件的路径:
KK2:alps\mediatek\external\EccList
L :alps\vendor\mediatek\proprietary\external\EccList。
EccList文件夹中会包含ecc_list.xml,以及与运营商有关的ecc_list_OP01.xml、ecc_list_OPXX.xml等对应文件,此外还包括一个EccList.mk的Makefile。实际运行中会根据Makefile文件中的定义匹配对应的XML文件作为判断是否是紧急号码的来源。
下面是ecc_list.xml文件中的内容:
*说明:
一 、添加号码请注意Condition的配置,根据需求来选择对应的值。
0:表示在无卡的时候当紧急号码;
1:表示始终当紧急号码;
2:表示界面上显示成紧急拨号,但实际以普通方式拨出。
二 、Category属性的设置于语音台选择有关,只有在实际拨打紧急号码的时候会将此号码配置的Category属性发送到Modem。国内默认都是‘0’,国外根据实际情况选择。
2 手机中有G卡,无C卡时,紧急号码包括:112,911,999,110,119,120共6个。
2.0 当G卡Radio off时,112,911通过GSM进行紧急呼叫(直接将G卡radio on),其他都固定采用CDMA进行紧急呼叫。
2.1 当G卡未解锁时,112,911通过GSM进行紧急呼叫,其他都固定采用CDMA进行紧急呼叫。
2.2 当G卡已经解锁时,所有呼叫都通过GSM进行。此时根据GSM规则,999,110,119,120不认为是紧急呼叫。
3 手机中有C卡,无G卡时,紧急号码包括:112, 911, 999, 000, 08, 118, 110, 119, 120共9个。
3.0 当C卡Radio off时,规则同第一点。固定采用CDMA进行紧急呼叫时,直接将C卡radio on。
3.1 当C卡未解锁时,规则同第一点。
3.2 当C卡已经解锁时,所有呼叫通过CDMA进行。根据CDMA规则,000,08,118不认为是紧急呼叫。
4 手机中同时有C卡和G卡时,紧急号码包括:112,911,999,110,119,120共6个。
4.0 两张卡都未解锁时,120,119,110,999固定采用CDMA进行紧急呼叫,112,911优先采用GSM进行紧急呼叫。
4.1 两卡处于下述状态时(未解锁,radio off)或(radio off,未解锁)或(radio off,radio off),采用4.1相同的规则,如需要采用radio off的卡进行紧急呼叫则该卡自动radio on。
4.2 G卡解锁,C卡未解锁或radio off,Dialer下所有呼叫都通过GSM进行。此时根据GSM规则,999,110,119,120不认为是紧急呼叫。此时,C卡解锁界面下的紧急呼叫按钮引发的紧急呼叫界面,支持通过CDMA网络对这六个紧急号码进行紧急呼叫。
4.3 G卡未解锁或radio off,C卡解锁,Dialer下所有呼叫都通过CDMA进行,此时根据CDMA 规则,这六个号码都是紧急呼叫。此时,G卡解锁界面下的紧急呼叫按钮引发的紧急呼叫界面,支持通过GSM网络对112,911发起紧急呼叫,其他号码均为非紧急呼叫号码。
4.4 两张卡都已经解锁的情况下,紧急号码包括:112,911,999,110,119,120共6个,此时所有紧急号码都通过CDMA网络拨出。
修改Call_feature_setting.xml文件,注释如下代码:
<PreferenceScreen android:key="button_ip_prefix_key" android:title="@string/ip_prefix_setting" android:summary="@string/ip_prefix_setting_sum" android:persistent="false"> <intent android:action="android.intent.action.MAIN" android:targetPackage="com.android.phone" android:targetClass="com.mediatek.settings.IpPrefixPreference"/> </PreferenceScreen>}
2.去掉“menu->IP拨号”菜单
alps/packages/apps/dialer/src/com/android/dialer/dialpad/dialpadFragment.java,在
buildOptionsMenu()方法中,把如下语句:
menu.findItem(R.id.menu_ip_dial).setVisible(
!PhoneNumberHelper.isUriNumber(mDigits.getText().toString()));
改成:
menu.findItem(R.id.menu_ip_dial).setVisible(false);
3.修改TelecomUtils.java文件,将
public static final boolean MTK_IP_PREFIX_SUPPORT = true;
修改为
public static final boolean MTK_IP_PREFIX_SUPPORT = false;
if (!PhoneNumberHelper.isUriNumber(views.number)) {
views.ipDialButtonView.setVisibility(View.VISIBLE);
} else {
views.ipDialButtonView.setVisibility(View.GONE);
}
修改为
views.ipDialButtonView.setVisibility(View.GONE);
}else{ mLastSignalLevel = iconLevel = mSignalStrength.getLevel(); if(mLastSignalLevel > oldLevel){ oldLevel = mLastSignalLevel; }else if(mLastSignalLevel < oldLevel){ mLastSignalLevel = iconLevel = oldLevel - 1; oldLevel = mLastSignalLevel; } Slog.d(TAG,"mLastSignalLevel = " + mLastSignalLevel);}
}else{ tempLastSignalLevel[0] = iconLevel[0] = tempSignalStrength.getLevel(); if(tempLastSignalLevel[0] > oldLevel){ oldLevel = tempLastSignalLevel[0]; }else if(tempLastSignalLevel[0] < oldLevel){ tempLastSignalLevel[0] = iconLevel[0] = oldLevel - 1; oldLevel = tempLastSignalLevel[0]; } Slog.d(TAG,"mLastSignalLevel = " + mLastSignalLevel);}
[Android Version]
Android V2.3 (GB,GB2,GB3)
Android V4.0, 4.1(ICS,ICS2,JB)
Android V4.2(JB2,JB3,JB5)
[DESCRIPTION]
[SOLUTION]
ro.operator.optr属性是代表工程中运营商的偏好行为,会在ProjectConfig.mk中由OPTR_SPEC_SEG_DEF的值来指定。目前这个属性只有八个值:OP01、OP02、OP03、OP06、OP07、OP08、OP09、OP10。
OP01表示中国移动(CMCC)
OP02表示中国联通(CU)
OP03表示Orange
OP06表示Vodafone
OP07表示AT&T
OP08表示TMO-US
OP09表示中国电信(CT)
OP10表示Tier-2 operator
且这个属性值目前无法增加其他的值。
对于OPTR_SPEC_SEG_DEF,举例来说明,例如我们指定为:
这样,代码行为就偏好于中国移动了。可以看见,值的第一部分为OP01,这个部分会转化为ro.operator.optr属性值。后面两个部分分别对应着这个运行商的哪一版本的Spec要求。例如上面的配置,系统就会找到:
private String reformat(CharSequence s, int cursor) { // The index of char to the leftward of the cursor. int curIndex = cursor - 1; String formatted = null; mFormatter.clear(); char lastNonSeparator = 0; boolean hasCursor = false; int len = s.length(); for (int i = 0; i < len; i++) { char c = s.charAt(i); if (PhoneNumberUtils.isNonSeparator(c)) { if (lastNonSeparator != 0) { formatted = getFormattedNumber(lastNonSeparator, hasCursor); hasCursor = false; } lastNonSeparator = c; } if (i == curIndex) { hasCursor = true; } } if (lastNonSeparator != 0) { formatted = getFormattedNumber(lastNonSeparator, hasCursor); } if(formatted != null) { formatted = formatted.replace(" ", "-");//add by MTK 20130117 } String tmpFormatted = formatted; String tmpS = ((CharSequence)s).toString(); tmpS = tmpS.replace("-","");//add by MTK 20130117 if (tmpFormatted != null) { tmpFormatted = tmpFormatted.replace(" ", "").replace("-", ""); if (tmpS.trim().length() > tmpFormatted.length()) { //Log.d("reformat", "s.length() > tmpFormatted.length()"); formatted = ((CharSequence)s).toString(); } } return formatted; }
- MTK_FAQ_Telephony - Phone
- MTK_FAQ_Telephony
- MTK_FAQ_Telephony - Contacts
- phone
- B-phone
- cell phone
- Phone Numbers
- windows phone
- Windows phone
- Phone Bills
- Phone Gap
- phone基本概念
- Phone List
- IP Phone
- phone相关
- phone 介绍
- Phone List
- hoj1640Mobile Phone
- Hive压缩格式
- POJ 1185 经典状压dp (模板)
- ReactJS - Components之间的传值问题
- Gradle及eclipse插件安装
- 113. Path Sum II
- MTK_FAQ_Telephony - Phone
- 学习前端的第一步:HTML
- 1090. Highest Price in Supply Chain (25)-PAT甲级真题
- 电路与Multisim基础 带锁型按钮开关
- 二维数组中的查找
- 电路与Multisim基础 电感的通直流阻交流的示例
- Linux下Kill多个同名进程
- 微信公众平台二次开发JAVA
- 2009 3