Android8.1 MTK平台 Dialer修改 (通话保持常亮/按钮接听)

通话保持常亮

在网上搜索的 Android保持屏幕常亮的方法,一种是 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

另一种是通过 wakeLock, 经过测试发现在 InCallActivity.java 中 onCreate()使用第一种并不生效,看网上说的要放到 setContentView()之前

然而试了也没生效,放到自己写的测试demo中,继承自 AppCompatActivity, setFlags需要传递两个参数,如下的方法生效了

getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

修改 InCallActivity 中的方法,编译时发现报错了,参数不合法,看到 InCallActivity 继承自 FragmentActivity, 不知道跟这个有没有关系,

于是采用第二种方法。

修改位置

alps\vendor\mediatek\proprietary\packages\apps\Dialer\java\com\android\incallui\InCallActivity.java

private PowerManager.WakeLock mWakeLock;

 @Override
  protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    //getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    //add keep inCallActivity keepScreenOn
    PowerManager powerManager= (PowerManager) getSystemService(Context.POWER_SERVICE);    
    mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "keep_screen_on_tag");
  }

  @Override
  protected void onResume() {
    super.onResume();
    mWakeLock.acquire();
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    mWakeLock.release();
  }

android.permission.WAKE_LOCK 权限 AndroidManifest 文件中已经存在,就不用添加了

接听方式上下滑动,改为按钮接听

安卓源码中提供了两种接听方式,一种为上下滑动,另一种为按钮接听。有点像苹果手机接听一样,有时候是滑动接听,

有时候是两个按钮,一个绿色的接听,一个红色的挂断。效果图如下

1.png

滑动接听方式

2.png

按钮接听方式

修改位置

vendor\mediatek\proprietary\packages\apps\Dialer\java\com\android\incallui\answer\impl\answermethod\AnswerMethodFactory.java

 @NonNull
public static AnswerMethod createAnswerMethod(@NonNull Activity activity) {
    if (needTwoButton(activity)) {
      return new TwoButtonMethod();
    } else {
      //return new FlingUpDownMethod();
      return new TwoButtonMethod();
    }
}

TwoButtonMethod.java 对应按钮接听方式

FlingUpDownMethod.java 对应滑动接听方式

简单说下逻辑,接听界面对应的类为 AnswerFragment,布局文件为 fragment_incoming_call,

接听部分布局id为 answer_method_container,通过加载 Fragment 进行替换

AnswerMethodFactory.createAnswerMethod(getActivity()),此方法去实例化按钮接听方式和滑动接听方式

接通时发送广播通知app(通话界面开始计时)

为啥需要这么干,通过监听状态改变也能判断电话接通,但是没有系统优先级高,这就需要我们来改源码了

**8.1 修改位置 **

vendor\mediatek\proprietary\packages\apps\Dialer\java\com\android\incallui\contactgrid\ContactGridManager.java

public void setCallState(PrimaryCallState primaryCallState) {
    this.primaryCallState = primaryCallState;
    
    if (DialerCall.State.ACTIVE == primaryCallState.state) {
        Log.e("InCallFragment", "sendBrocast Call.State.ACTIVE =" + primaryCallState.state);
        //cczheng add  , send broadcast when is active
        Intent broIntent = new Intent();
        broIntent.setAction("com.call.state.active");   
        context.sendBroadcast(broIntent);
        //cczheng add  , send broadcast when is active
        
    }
    updatePrimaryNameAndPhoto();
    updateBottomRow();
    updateTopRow();
  }

6.0 修改位置

packages\apps\InCallUI\src\com\android\incallui\CallCardFragment.java

@Override
public void setCallState(
        int state,
        int videoState,
        int sessionModificationState,
        DisconnectCause disconnectCause,
        String connectionLabel,
        Drawable callStateIcon,
        String gatewayNumber,
        boolean isWifi,
        boolean isConference) {
    boolean isGatewayCall = !TextUtils.isEmpty(gatewayNumber);
    CallStateLabel callStateLabel = getCallStateLabelFromState(state, videoState,
            sessionModificationState, disconnectCause, connectionLabel, isGatewayCall, isWifi,
            isConference);

....

if (Call.State.ACTIVE == state) {
        Log.d(this, "sendBrocast Call.State.ACTIVE " + state);
        //cczheng add  , send broadcast when is active
        Intent broIntent=new Intent();
        broIntent.setAction("com.call.state.active");   
        getActivity().sendBroadcast(broIntent);
       
        if(CallUtils.isVideoCall(videoState)){
            //videoCall
            final View buttonsView=getView().findViewById(R.id.buttons_container);
            buttonsView.setBackgroundColor(Color.argb(0x99,0xff,0xff,0xff));
            videoFragment.setBGColor(Color.argb(0xff,0x00,0x00,0x00));
        }
    }
}

简单说下,通过打印日志可以看到8.1的接通状态值变化为

CONNECTING(13)->DIALING(6)->ACTIVE(3)->DISCONNECTING(9)->DISCONNECTED(10)->IDLE(2)

alps\vendor\mediatek\proprietary\packages\apps\Dialer\java\com\android\incallui\call\DialerCall.java

public static class State {

public static final int INVALID = 0;
public static final int NEW = 1; /* The call is new. */
public static final int IDLE = 2; /* The call is idle.  Nothing active */
public static final int ACTIVE = 3; /* There is an active call */
public static final int INCOMING = 4; /* A normal incoming phone call */
public static final int CALL_WAITING = 5; /* Incoming call while another is active */
public static final int DIALING = 6; /* An outgoing call during dial phase */
public static final int REDIALING = 7; /* Subsequent dialing attempt after a failure */
public static final int ONHOLD = 8; /* An active phone call placed on hold */
public static final int DISCONNECTING = 9; /* A call is being ended. */
public static final int DISCONNECTED = 10; /* State after a call disconnects */
public static final int CONFERENCED = 11; /* DialerCall part of a conference call */
public static final int SELECT_PHONE_ACCOUNT = 12; /* Waiting for account selection */
public static final int CONNECTING = 13; /* Waiting for Telecom broadcast to finish */
public static final int BLOCKED = 14; /* The number was found on the block list */
public static final int PULLING = 15; /* An external call being pulled to the device */
/// M: [Modification for finishing Transparent InCall Screen if necessary]
/// such as:ALPS02302461,occur JE when MT call arrive at some case. @{
public static final int WAIT_ACCOUNT_RESPONSE = 100;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,165评论 6 523
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,476评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,446评论 0 368
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,157评论 1 301
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,164评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,615评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,969评论 3 430
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,959评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,495评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,529评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,641评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,233评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,976评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,407评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,552评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,218评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,715评论 2 366

推荐阅读更多精彩内容