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

作者:帅得不敢出门

相关推荐
qq_3363139310 分钟前
java基础-字符串
java
二进制person2 小时前
Java EE初阶 --多线程2
java·开发语言
007php0073 小时前
某游戏大厂 Java 面试题深度解析(四)
java·开发语言·python·面试·职场和发展·golang·php
西西学代码3 小时前
Flutter---个人信息(5)---持久化存储
java·javascript·flutter
陈果然DeepVersion3 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(五)
java·spring boot·kafka·向量数据库·大厂面试·rag·ai智能客服
FAFU_kyp4 小时前
Spring Boot 邮件发送系统 - 从零到精通教程
java·网络·spring boot
脚踏实地的大梦想家4 小时前
【Docker】P2 Docker 命令:从Nginx部署到镜像分享的全流程指南
java·nginx·docker
Blossom.1184 小时前
把AI“编”进草垫:1KB决策树让宠物垫自己报「如厕记录」
java·人工智能·python·算法·决策树·机器学习·宠物
芒克芒克4 小时前
ssm框架之Spring(上)
java·后端·spring
消失的旧时光-19434 小时前
Android ble理解
java·kotlin