MTK_FAQ_Telephony - Phone

来源:互联网 发布:国密算法实现 编辑:程序博客网 时间:2024/06/07 03:29
[FAQ14165]L上来电全屏显示

内容

请在 PhoneStatusBar.java 中做如下修改, 关键字"ALPS02303269". 

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        /// @}        ) {        ...........................;    }    .................................;}






[FAQ14847]L版本如何在未锁屏时来电直接显示全屏界面
[DESCRIPTION]
 L版本中, 来电直接显示来电界面, 而不是 show Notification(HeadsUp view)
 
 
 
[SOLUTION]
 
HeadsUp 是 google 在 L 版本上面 PhoneStatusBar 中新增的功能.
 
而在未锁屏时来电就是通过这种方式来显示的. 从而替代了全屏显示来电界面的方式.
 
如果客户还是倾向于全屏显示来电界面. 则可以通过如下方式来单独关闭通话的 HeadsUp 功能.

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;        }    }    .................................;}




[FAQ14701]C2K项目上Conference Call的介绍

[DESCRIPTION]
C2K项目上Conference Call的介绍。

 

[SOLUTION]
C2K项目上,Conference Call分为两种:

  1. Three-Party Call
  2. 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



[FAQ14653]Call Setting界面在双卡时如何区分相同运营商的SIM卡
[DESCRIPTION]
 
 L1版本在Call Setting界面中如果两张SIM卡为相同运营商时,UI上显示的名称一样不好区分。下面给出的方法是在运营商名称后面加上PhoneNumber以区分两张SIM卡。
 
 
[SOLUTION]
 
 1. PhoneAccountSettingsFragment.java(alps/packages/services/telephony/src/com/android/phone/settings),只需要按照如下方法在初始化label时加上phonenumber。
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); }}



[FAQ10503]国际拨号助手中寻找Valid country ISO的规则
[DESCRIPTION]
 
开启国际拨号助手时,针对一个号码如果对注册网络国家(current country ISO)为invalid,那么国际拨号助手会寻找针对这个号码合法的country ISO,以便于将合法的country ISO推荐给User帮助user自动添加国家码。这个寻找Valid country ISO的规则是怎样的?有什么特殊之处?
 
 
[SOLUTION]
规则如下图所示,其中prefer country ISO是指call log里面已经存在了这个号码,并且之前拨打时的国家码,current counrty ISO以注册网络的country ISO为第一优先级,sim卡的country ISO指sim卡IMSI中标识的country,最主要的是最后一个database里面的记录,在前面几种方式都没有找到一个country ISO可以使这个号码是Valid时,这是就会去call log里面查找,查找的规则并不会进行号码匹配判断,而是从第一个记录开始,看是否会Valid,如果Valid就返回。也就是说如果记录里有一个HK的country ISO记录,在前面3种方式返回invalid后,进入到database里找,找到HK,然后号码对HK范围Valid,那么就会给user推荐HK的国家码。



[FAQ14444]双sim卡时,suspend下通过蓝牙耳机拨号只唤醒屏幕没有选卡提示
[DESCRIPTION]
 
1、手机里有通话记录,熄屏状态下,长按蓝牙耳机的send key,仅仅会点亮屏幕,而不会出现弹出选择SIM卡的界面;

Note:而亮屏状态下,长按蓝牙耳机的send key,则会弹出选择SIM卡的界面,如果选择则可以正常呼出;
 
 
[SOLUTION]
 
 Known Google Issue,现在并没有妥善的解法。
 
[Root Cause]
当Suspend手机时,AMS会进入sleep状态。在这种情况下去启动InCallActivity界面时,就会出现先onResume()然后立即onPause()的flow。
而由于InCall和Telecom的交互结构所限,选卡界面在遇到onPause时必须断call,进而退出UI。这个过程发生得很快,用户就难以看到选卡界面先show出来,再消失掉这个过程。


[FAQ14445]为什么在拨号选卡界面来电时无来电铃声?
 [DESCRIPTION]
【前提条件】插双卡
【操作步骤】
1.拨号盘,输入号码进行拨号
2.在选择SIM卡界面停留
3.此时来电
【实际结果】显示来电界面无响铃。
[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 ;}            ......    }       ......




[FAQ04051]拨号过程中显示“Unknown Caller”

[Android Version]

Android V2.3 GB,GB2,GB3

Android V4.0, 4.1,4.2,4.3,4.4ICSICS2JBJ,B2,JB3,JB5,KK1,KK1.MP1,KK1.MP3

Android V5.0,5.1L0,L1

 

[DESCRIPTION]

拨号过程中显示“Unknown Caller”

[SOLUTION]

一, KK及之前的版本:可将文件InCallScreen.java中的
(KK版本在SuppMessageManager.java)
函数doSuppCrssSuppServiceNotification中的以下语句
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)) {//仅当号码不为空时才更新号码


二, L0版本修改如下:
1.TelephonyConnection.java -->Handler
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版本修改如下:
1. GsmConnection的修改同L0一样。
 
2. SuppMessageManager.java --> onCrssSuppServiceNotification()
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;







[FAQ14322]关于L版本来电响铃与UI同步的Workround方法
[DESCRIPTION]
 
SW Version:L0、L1 
 
     由于Google  默认设计中来电铃声一路和UI启动一路是分开跑,通常情形下UI一路的启动要比响铃更耗时间;所以会存在来电界面起来比铃声稍晚的用户体验,尤其是在灭屏时候的来电。下面的Workround方法给出了L版本上对于此问题的优化方案。
 
 
[SOLUTION]
 修改内容如下:

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    }





[FAQ02900]客制化电话断开时的clear code的行为

[Android Version]

Android V2.3 GB,GB2,GB3

Android V4.0, 4.1ICSICS2JB

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 code8的情况为例,步骤如下:

一 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.008Annex 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)。




[FAQ13989]L版本上关于通话时间显示异常的处理
[DESCRIPTION]
SW Version:L0、L1
 
1. 问题1:通话记录里面显示的通话时长与实际不一致的问题。
2. 问题2:通话过程中去设置时间,通话计时时间会变的问题。
 
[SOLUTION]
 
 一、如果只须解决问题1,请申请Patch ID:ALPS01887060,具体修改如下图示:
CallLogManager.java
 
 二、如果只须解决问题2,L0版本请参考如下修改:
 
1.       CallCardPresent.java

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项目才有)
6.       MissedCallNotifier.java


  三、如果是L1版本,解决问题2请参考如下修改:

1.       Call.java(packages\services\Telecomm\src\com\android\server\telecom)

 2.       CallCardPresenter.java(packages\apps\incallui\src\com\android\incallui)

 
3.       CallLogManager.java (packages\services\telecomm\src\com\android\server\telecom)
 
4.       CallsManager.java(packages\services\telecomm\src\com\android\server\telecom)

 
5.       MissedCallNotifier.java(packages\services\telecomm\src\com\android\server\telecom)
6.       StatusBarNotifier.java(packages\apps\incallui\src\com\android\incallui)
 




[FAQ02892]紧急号码的管理及客制化方法

[DESCRIPTION]

    紧急号码的客制化分为AP(android)端和modem端两部分。以下是Smartphohe平台上拨号的一个逻辑流程.

[SOLUTION]

根据上述拨号逻辑流程,可知:

【Ⅰ】如果一个紧急号码要求不管在什么情况下,都以“紧急方式呼出”,则可采取如下两种修改方法:

a.只修改AP部分,即:AP端采取“紧急式呼叫”便可。

b.修改APModem两部分。AP端采用“非紧急式呼叫”进行客制化,而Modem端的客制化请参考如下Modem部分的修改。

【Ⅱ】如果一个紧急号码要求在手机有卡时,以“普通方式呼出”,在无卡时,以“紧急方式呼出”,则可采取如下修改方法:

a.   修改APModem两部分。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结尾,第5uint16是参数,“1”表示此号码始终以紧急方式呼出;“0”表示此号码在手机有卡时,以普通方式呼出,无卡时,以紧急方式呼出。

 

 注意事项

1.客制化紧急拨号功能时,注意不同软件版本的区别:

A.对于GB, GB2, ICS, ICS2这四个版本,请直接参考上述修改方法.

B.对于GB3,JB,JB3及以上版本,由于在phoneNumberUtils.java文件中,对isSpecialEmergencyNumber(..)isEmergencyNumber()方法定义有所改变,如下(红色框标识差异的地方)

 

……

 

 

 

 

 

……

}

 

 

针对以上不同点,在客制化紧急号码时,请采取如下方式去修改以上两方法的不同点:

1查看mediatek\operator\Opxxx(OP01OP02、。。。)\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’,国外根据实际情况选择。






[FAQ14164]CDMA+GSM项目紧急号码介绍
[DESCRIPTION]
 
 CDMA+GSM项目紧急号码介绍
[SOLUTION]
1 手机中无卡时,紧急号码包括:112,911,999,000,08,118,110,119,1209个。120,110,119固定采用CDMA进行紧急呼叫; 000, 08, 118, 112, 911, 999固定采用GSM进行紧急呼叫。

2 手机中有G卡,无C卡时,紧急号码包括:112,911,999,110,119,1206个。

     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, 1209个。

   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,1206个。

    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网络拨出。


[FAQ13534][L版本]如何去掉IP拨号功能
1.去掉 “menu->设置->语音电话->IP号码前缀” 菜单.
修改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;
 
4. 修改CallLogAdapter.java文件的bindActionButtons()方法,
if (!PhoneNumberHelper.isUriNumber(views.number)) {
                views.ipDialButtonView.setVisibility(View.VISIBLE);
            } else {
                views.ipDialButtonView.setVisibility(View.GONE);
            }
修改为
views.ipDialButtonView.setVisibility(View.GONE);



[FAQ10147]三个网络模式设置的关系
[DESCRIPTION]
在设置中有“Network Mode”,在工模中有“Network Selecting”,还有“RAT Mode”
 
[SOLUTION]
设置中“Network Mode”:给用户使用,根据需求可能某些模式不提供设置。
工模中“Network Selecting”:供测试使用,比设置中的选项更完整
工模中“RAT Mode”:该设置功能同工模中“Network Selecting”,但以它的设置为优先,该设置起作用,其它两项设置无效。


[FAQ08972]信号格显示的平滑处理
[DESCRIPTION]
 
在一些信号很差的地区,手机上的信号格显示会跳动得很厉害。部分客户为了让用户感觉良好,希望让信号的跳动不要太过频繁,跳动不要太厉害,做此客制化修改。
 
[SOLUTION]
单卡项目:
在NetworkController.java中修改:
添加变量
private int oldLevel = 0;
 
修改private final void updateTelephonySignalStrength()
 
将下面的代码
}else{
    mLastSignalLevel = iconLevel = mSignalStrength.getLevel();
}
修改为:
}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);}


 
 
双卡项目:
在NetworkControllerGemini.java中修改:
添加变量
private int oldLevel = 0;
 
修改private final void updateTelephonySignalStrength(int slotId)
 
将下面的代码
}else{
    tempLastSignalLevel[0] = iconLevel[0] = tempSignalStrength.getLevel();
}
修改为:
}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);}





[FAQ02941]ro.operator.optr属性问题

 [Android Version]

Android V2.3 GB,GB2,GB3

Android V4.0, 4.1ICS,ICS2,JB

Android V4.2JB2,JB3,JB5

[DESCRIPTION]

[SOLUTION]

ro.operator.optr属性是代表工程中运营商的偏好行为,会在ProjectConfig.mk中由OPTR_SPEC_SEG_DEF的值来指定。目前这个属性只有八个值:OP01OP02OP03OP06OP07、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要求。例如上面的配置,系统就会找到:



[FAQ11322]如何关闭通话录音功能?
将alps/packages/apps/phone/src/com/mediatek/phone/PhoneFeatureConstants.java中的内部类
FeatureOption的MTK_PHONE_VOICE_RECORDING开关置为false即可.


[FAQ10854]修改Incallscreen界面各个layout的高度
CallCard.java中会调用updateCallInfoLayout()设定Call_card部分的layout宽高,
其中会调用InCallTouchUi.java的getTouchUiHeight()计算incall_touch_ui部分的高度,
该函数通过(int) getResources().getDimension(R.dimen.in_call_end_button_height)获得end button的高度,
参考此过程即可修改incallscreen中相应部分的高度。
如下图所示:








[FAQ09512]如何修改拨号盘中号码显示分隔符,由现在的空格符修改为"-"符号
[DESCRIPTION]
1.在Idle界面,点击拨号图标,进入拨号界面。
2.输入一电话号码。
3.观察输入的电话号码,发现号码带空格分隔符。
期望结果:
          修改空格分隔符为"-"分隔符。
 
 
[SOLUTION]
  经过分析,发现拨号盘中输入的号码的空格分隔符是由如下方法(红字表示的地方)设置了format所引起的。
  Dialpadfragment.onCreateView(...){
......
  PhoneNumberFormatter.setPhoneNumberFormatteringTextWatcher(getactivity(),mDigits,mHandler);
......
}
      从上述方法(红字表示的地方)进一步跟踪代码,可找到代码的修改点(红字表示的地方)是如下文件中的如下方法:
1.frameworks\base\telephony\java\android\telephony\PhoneNumberFormattingTextWatcher.java
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;    }
























0 0
原创粉丝点击