谷歌Dialer和来电铃声不同步问题修改

简介: 谷歌Dialer和来电铃声不同步问题修改

bug 描述:来电铃声响起后,来电页面隔个2~4秒才起来


解决思路


把原有响铃逻辑稍微延后,等到页面起来后再通知铃声播放。

响铃实际在 Telecomm 中,这个简单

要判断页面是否在前台这个有点挑战,一开始没啥思路,后来分析 log 找到了很明显的地方 DecorView

V/PhoneWindow: DecorView setVisiblity: visibility = 4, Parent = android.view.ViewRootImpl@b9781c9, this = DecorView@383b0ce[LiveWallpaperActivity]
V/PhoneWindow: DecorView setVisiblity: visibility = 0, Parent = android.view.ViewRootImpl@b9781c9, this = DecorView@383b0ce[LiveWallpaperActivity]
V/PhoneWindow: DecorView setVisiblity: visibility = 0, Parent = android.view.ViewRootImpl@a138a1d, this = DecorView@f98de06[Settings$WallpaperSettingsActivity]
V/PhoneWindow: DecorView setVisiblity: visibility = 4, Parent = android.view.ViewRootImpl@bcb3e0a, this = DecorView@d2e335f[MainActivity]
V/PhoneWindow: DecorView setVisiblity: visibility = 4, Parent = android.view.ViewRootImpl@b9781c9, this = DecorView@383b0ce[LiveWallpaperActivity]


每一个页面(activity) 的根布局为 DecorView,从上面 log 看到在 0/visible 和 4/invisible 之间不断切换,那基本上就可以从这里下手


frameworks\base\core\java\com\android\internal\policy\DecorView.java


    @Override
    public void setVisibility(int visibility) {
        super.setVisibility(visibility);
        String packageName = this.getContext().getPackageName();
    /*if (ViewDebugManager.DEBUG_USER) {
      Log.v("PhoneWindow", "DecorView setVisiblity: visibility = " + visibility
            + ", Parent = " + getParent() + ", this = " + this + " packageName="+packageName);
    }*/
        if ("com.android.dialer".equals(packageName)
     || "com.google.dialer".equals(packageName)) {
            getContext().sendBroadcast(new android.content.Intent("com.android.action.activityChange")
                .putExtra("visibility", visibility));
        }
    }

通知已经发出,接下来去 Telecomm 中接收处理响铃

vendor\mediatek\proprietary\packages\services\Telecomm\src\com\android\server\telecom\Ringer.java

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
    public Ringer(
            InCallTonePlayer.Factory playerFactory,
            Context context,
            SystemSettingsUtil systemSettingsUtil,
            AsyncRingtonePlayer asyncRingtonePlayer,
            RingtoneFactory ringtoneFactory,
            Vibrator vibrator,
            VibrationEffectProxy vibrationEffectProxy,
            InCallController inCallController) {
        mIsHapticPlaybackSupportedByDevice =
                mSystemSettingsUtil.isHapticPlaybackSupported(mContext);
     //add
     android.util.Log.d("Ringer", "Initializes the Ringer"); 
       mContext.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                 int visibility = intent.getIntExtra("visibility", 4);
                 if (visibility == 0) {
                    if (!justRingOnce) {
                        justRingOnce = true;
                        startRinging(foregroundCall, isHfpDeviceAttached, true);
                    }
                 }else {
                     justRingOnce = false;
                 }
            }
        }, new IntentFilter("com.android.action.activityChange"));
       //end
    }
  //add
    Call foregroundCall;
    boolean isHfpDeviceAttached;
    boolean justRingOnce;
    public boolean startRinging(Call foregroundCall, boolean isHfpDeviceAttached) {
      this.foregroundCall = foregroundCall;
        this.isHfpDeviceAttached = isHfpDeviceAttached;
    return false;
  }
  //end
  public boolean startRinging(Call foregroundCall, boolean isHfpDeviceAttached, boolean newFun) {
        if (foregroundCall == null) {
            /// M: ALPS03787956 Fix wtf log warning. @{
            /// Hand up the call immediately when ringing. Then the foreground call will
            /// change to null, but call audio is start ringing at the same time.
            /// Log.wtf will occur in this case.
            /// Solution:
            /// Call audio can handle this case, so change Log.wtf to Log.i here.
            Log.i(this, "startRinging called with null foreground call.");
            /// @}
            return false;
        }


目录
相关文章
|
语音技术
FreeSwitch中音乐功能保持和静音回铃声怎样设置
FreeSwitch中音乐功能保持和静音回铃声怎样设置
|
4月前
|
Web App开发 前端开发 API
老板的灵魂提问: 别人家的视频能自动播放为什么你开发的无法自动播放?为什么网页上的音视频无法自动播放了?
老板的灵魂提问: 别人家的视频能自动播放为什么你开发的无法自动播放?为什么网页上的音视频无法自动播放了?
|
7月前
利用电脑投放手机声音且可不冲突同时播放电脑声音的方法
利用电脑投放手机声音且可不冲突同时播放电脑声音的方法
157 1
|
数据处理 Windows
[Windows] 微信超级管家,自动好友回复、计数、自动同意、群发、好友导出、消息日志、无限多开
微信超级管家是一款大神针对微信制作的工具,它的主要功能包括了自动回复、好友计数、自动同意、群发、好友导出、消息日志、无限多开等等,让你拥有无限潜力哈,经常使用微信电脑版的朋友一定会用的上。
[Windows] 微信超级管家,自动好友回复、计数、自动同意、群发、好友导出、消息日志、无限多开
|
消息中间件 存储 API
iOS小技能:队列管理推送通知,解决收款到账并发语音播报问题。
需求:收款到账语音提醒功能 NSE是比Voip更优雅的解决方案,完成迁移后,总体代码量也比Voip方案少了不少。
309 0
iOS小技能:队列管理推送通知,解决收款到账并发语音播报问题。
程序人生 - 王者荣耀隐身设置,不让好友看到在线状态
程序人生 - 王者荣耀隐身设置,不让好友看到在线状态
311 0
程序人生 - 王者荣耀隐身设置,不让好友看到在线状态
|
Java Android开发
android消息通知更新(小红点,数字提醒)之badgeview
android消息通知更新(小红点,数字提醒)之badgeview
android消息通知更新(小红点,数字提醒)之badgeview
Andorid通话自动录音
Andorid通话自动录音
221 0
Andorid通话自动录音
|
数据安全/隐私保护 关系型数据库 RDS
魅族手机便签的备忘录内容误删了怎么办?
魅族手机便签的备忘录内容误删了怎么办? 大多数人会想到,魅族手机有云服务账号,一般情况下可以在云服务中找回。前提是需要将备忘录内容进行备份,牢记自己的账号密码。
2354 0
|
Web App开发
魅族手机里的便签怎么导出转移到新的手机上?
魅族手机时尚简约,清新文艺,受到不少年轻人的青睐。 其手机便签可以设置主题,既文艺又别致。同时,如果想要把旧的魅族手机里的便签内容导出转移到新的魅族手机上,只需要在旧的魅族手机中开启云同步功能,将便签内容同步到云端,然后在新的魅族手机上登录自己的魅族账号,能够把云端的便签内容同步到新手机上。
7709 0