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");

作者:帅得不敢出门

相关推荐
fundroid几秒前
Kotlin 泛型进阶:in、out 与 reified 实战
android·开发语言·kotlin
奋斗的小方2 分钟前
01 一文读懂UML类图:核心概念与关系详解
java·uml
Android系统攻城狮2 分钟前
Android tinyalsa深度解析之pcm_open调用流程与实战(一百零三)
android·pcm·tinyalsa·音频进阶·音频性能实战·android hal
大学生小郑3 分钟前
影像测评知识分享
图像处理·音视频·视频
枫叶丹43 分钟前
【Qt开发】Qt系统(十一)-> Qt 音频
c语言·开发语言·c++·qt·音视频
发哥来了4 分钟前
主流AI视频生成商用方案选型评测:关键能力与成本效益分析
大数据·人工智能·音视频
长安城没有风6 分钟前
Java 高并发核心编程 ----- 线程池原理与实践(上)
java·juc
Remember_9936 分钟前
Spring 核心原理深度解析:Bean 作用域、生命周期与 Spring Boot 自动配置
java·前端·spring boot·后端·spring·面试
2501_944448007 分钟前
Flutter for OpenHarmony衣橱管家App实战:意见反馈功能实现
android·javascript·flutter
风流倜傥唐伯虎11 分钟前
./gradlew assembleDebug和gradle build区别
android·android studio