MTK_FAQ_Telephony - Phone

本文详细介绍了在MTK平台上的Android电话功能,包括Three-Party Call和Call Waiting的区别,操作流程以及限制。此外,还涉及拨号过程中显示"Unknown Caller"问题的解决方案,以及如何进行Clear Code客制化,特别提到了小于127的Clear code的修改步骤。最后,讨论了紧急号码的客制化,包括AP和Modem端的修改方法,并提供了不同Android版本的紧急号码处理方式。
摘要由CSDN通过智能技术生成
[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";
/// @}

@Override
public 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方法
Android动态权限申请read_phone_state是指在Android应用程序运行时,向系统请求获取获取手机状态的权限。read_phone_state权限用于读取手机的状态信息,例如设备的电话状态、IMEI号码、手机号码等。 在Android 6.0(API级别23)及以上版本中,Google引入了动态权限申请机制,要求开发者在使用涉及到敏感权限的地方,必须在运行时向用户申请权限。这是为了增强用户对隐私信息的控制,并提高应用的安全性。 为了申请read_phone_state权限,开发者需要先在AndroidManifest.xml文件中声明以下权限: <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 接下来,在应用中的合适位置,开发者需要编写相关代码来动态请求权限。以下是一个示例: // 检查应用是否已经获取了权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { // 如果未获取权限,则向用户申请权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_PHONE_STATE); } else { // 如果已经获取了权限,则执行相应的操作 // 例如,从手机状态中获取IMEI号码 TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); String imei = telephonyManager.getDeviceId(); } 在上述代码中,我们首先检查应用是否已经获取了read_phone_state权限,如果未获取权限,则向用户申请权限。如果已经获取了权限,我们可以执行获取手机状态信息的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值