Android Framework打电话禁止播放运营商视频彩铃

文章目录

需求:打电话时,对方未接听,这个时候可能会播放运营商的视频彩铃,需求是屏蔽彩铃播放。
测试平台:展锐。
安卓版本:13。

定位Android电话的源码及UI

打电话时查看logcat打印

复制代码
com.android.dialer/com.android.incallui.InCallServiceImpl
start default phone app:com.android.dialer

 START u0 {act=android.intent.action.MAIN flg=0x10040000 cmp=com.android.dialer/com.android.incallui.InCallActivity (has extras)}
com.android.dialer/com.android.incallui.InCallActivity

2024-12-24 11:24:39.914  9381-12016 WindowManager           system_server                        D   update app focus from ActivityRecord{9a442d2 u0 com.ntt.n.phone/.mpv.presenter.PhoneKeyboardActivityPresenter t45} to ActivityRecord{c32e28 u0 com.android.dialer/com.android.incallui.InCallActivity t48}
InCallActivity.showMainInCallFragment
InCallFragment.onCreateView

从打印可以大致知道源码及界面类的信息InCallActivity及InCallFragment,

其对应的apk源码在vendor/sprd/platform/packages/apps/SprdDialer目录下,

界面类java/com/android/incallui/InCallActivity.java

java 复制代码
 setContentView(R.layout.incall_screen);

其ui内容res/layout/incall_screen.xml比较简短

xml 复制代码
<!-- In-call Phone UI; see InCallActivity.java. -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <FrameLayout
   android:id="@+id/main"
   android:layout_width="match_parent"
   android:layout_height="match_parent"/>

 <View
   android:id="@+id/psuedo_black_screen_overlay"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="#000000"
   android:visibility="gone"
   android:keepScreenOn="true"/>
</FrameLayout>

禁止打电话时播放运营商广告视频彩铃

运营商视频彩铃

安卓打电话时出现视频彩铃广告是因为对方开通了视频彩铃业务,这是一种基于 VoLTE 技术的运营商业务,被叫方定制后,主叫方在拨打电话等待接通时就可能会看到一段视频媒体来替代普通网络回铃音。

如下图:

framework禁止播放视频彩铃

  1. 看log打印

    2024-12-24 16:28:55.615 11385-11385 Dialer com.android.dialer I VideoPauseController.setUp - enter
    2024-12-24 16:28:55.639 11385-11385 Dialer com.android.dialer I InCallPresenter.setUp - mIsVideoEnable = true

  2. 定位到代码
    vendor/sprd/platform/packages/apps/SprdDialer/java/com/android/incallui/
    InCallPresenter.java
    关键在于变量isSupportVideoRingTone的值

java 复制代码
private boolean[] isSupportVideoRingTone;

  private void updateCarrierConfiguration(int phoneId, boolean reset) {
      int subId =  getSubIdByPhoneId(phoneId);
      UniCarrierConfigManager configManager = new UniCarrierConfigManager(context);
      PersistableBundle b = null;
      LogUtil.i("InCallPresenter.updateCarrierConfiguration", "subId:  %d", subId);
      if (subId != -1 && !reset
              && configManager != null && configManager.getConfigForSubId(subId) != null) {
          b = configManager.getConfigForSubId(subId);
          isConferenceParticipantLabel[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_CARRIER_CONFERENCE_PARTICIPANT_LABEL);
          isShowNumberAndName[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_SHOW_NUMBER_AND_NAME);
          isSupportMultiVideoCall[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_CARRIER_SUPPORT_MULTI_VIDEO_CALL);
          isHdVoiceIconShouldBeRemoved[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_HD_VOICE_ICON_SHOULD_BE_REMOVED);
          isFeatureHdAudio[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_FEATURE_HD_AUDIO);
          isSupportVideoRingTone[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_CARRIER_SUPPORTS_VIDEO_RING_TONE);
          isShowHoldButton[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_CARRIER_SHOW_HOLD_BUTTON);
          isSupportVideoCustomerService[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_SUPPORT_VIDEO_CUSTOMER_SERVICE);
          LogUtil.i("InCallPresenter.updateCarrierConfiguration","getCarrierConfig from subid");
      } else {
          isConferenceParticipantLabel[phoneId] = true;
          isShowNumberAndName[phoneId] = false;
          isSupportMultiVideoCall[phoneId] = true;
          isHdVoiceIconShouldBeRemoved[phoneId] = false;
          isFeatureHdAudio[phoneId] = false;
          isSupportVideoRingTone [phoneId]= false;
          isShowHoldButton[phoneId] = true;
          isSupportVideoCustomerService[phoneId] = false;
          LogUtil.i("InCallPresenter.updateCarrierConfiguration","use default carrierConfig");
      }
  }

java 复制代码
          isSupportVideoRingTone[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_CARRIER_SUPPORTS_VIDEO_RING_TONE);
  1. 代码修改
    只要固定isSupportVideoRingTone数组中所有值为false就可以避免播放视频彩铃
java 复制代码
          isSupportVideoRingTone [phoneId]= false;

修改的patch如下

patch 复制代码
diff --git a/vendor/sprd/platform/packages/apps/SprdDialer/java/com/android/incallui/InCallPresenter.java b/vendor/sprd/platform/packages/apps/SprdDialer/java/com/android/incallui/InCallPresenter.java
index 29a2f4836e..a2e2b1206b 100755
--- a/vendor/sprd/platform/packages/apps/SprdDialer/java/com/android/incallui/InCallPresenter.java
+++ b/vendor/sprd/platform/packages/apps/SprdDialer/java/com/android/incallui/InCallPresenter.java
@@ -2822,7 +2823,8 @@ public class InCallPresenter implements CallList.Listener, AudioModeProvider.Aud
           isSupportMultiVideoCall[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_CARRIER_SUPPORT_MULTI_VIDEO_CALL);
           isHdVoiceIconShouldBeRemoved[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_HD_VOICE_ICON_SHOULD_BE_REMOVED);
           isFeatureHdAudio[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_FEATURE_HD_AUDIO);
-          isSupportVideoRingTone[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_CARRIER_SUPPORTS_VIDEO_RING_TONE);
+          //isSupportVideoRingTone[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_CARRIER_SUPPORTS_VIDEO_RING_TONE);
+          isSupportVideoRingTone [phoneId]= false;
           isShowHoldButton[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_CARRIER_SHOW_HOLD_BUTTON);
           isSupportVideoCustomerService[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_SUPPORT_VIDEO_CUSTOMER_SERVICE);
           LogUtil.i("InCallPresenter.updateCarrierConfiguration","getCarrierConfig from subid");

作者:帅得不敢出门

相关推荐
lssjzmn6 小时前
Java轻量级状态机在支付流程中的设计与实现
java·后端
非凡ghost6 小时前
Solid Explorer文件管理器:功能强大的安卓文件管理器及网盘文件管理器
android·学习·软件需求
独自破碎E6 小时前
得物25年春招-安卓部分编程题
android·java·开发语言
渣哥6 小时前
HashMap 底层原理解析:容量设计为何总是 2 的 n 次方
java
渣哥6 小时前
HashMap 与 ConcurrentHashMap 有什么区别?通俗易懂版
java
用户2018792831676 小时前
StickerHeaderRecyclerView的一种简易实现
android
ChillJavaGuy6 小时前
Java中的四大引用类型强引用、软引用、弱引用、虚引用
java·开发语言·jvm·四大引用类型
华仔啊6 小时前
Java泛型符号T、E、K、V、?总混用?5分钟彻底讲透,别再搞错了!
java
扑克中的黑桃A6 小时前
飞算JavaAI智慧农业场景实践:从生产监测到产销协同的全链路系统搭建
java