文章目錄
- 定位Android電話的源碼及UI
- 禁止打電話時播放運營商廣告視頻彩鈴
- 運營商視頻彩鈴
- framework禁止播放視頻彩鈴
需求:打電話時,對方未接聽,這個時候可能會播放運營商的視頻彩鈴,需求是屏蔽彩鈴播放。
測試平臺:展銳。
安卓版本:13。
定位Android電話的源碼及UI
打電話時查看logcat打印
com.android.dialer/com.android.incallui.InCallServiceImpl
start default phone app:com.android.dialerSTART u0 {act=android.intent.action.MAIN flg=0x10040000 cmp=com.android.dialer/com.android.incallui.InCallActivity (has extras)}
com.android.dialer/com.android.incallui.InCallActivity2024-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
setContentView(R.layout.incall_screen);
其ui內容res/layout/incall_screen.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"><FrameLayoutandroid:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"/><Viewandroid: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禁止播放視頻彩鈴
- 看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
- 定位到代碼
vendor/sprd/platform/packages/apps/SprdDialer/java/com/android/incallui/
InCallPresenter.java
關鍵在于變量isSupportVideoRingTone的值
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");}}
把
isSupportVideoRingTone[phoneId] = b.getBoolean(UniCarrierConfigManager.KEY_CARRIER_SUPPORTS_VIDEO_RING_TONE);
- 代碼修改
只要固定isSupportVideoRingTone數組中所有值為false就可以避免播放視頻彩鈴
isSupportVideoRingTone [phoneId]= false;
修改的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.AudisSupportMultiVideoCall[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");
作者:帥得不敢出門