单路通话挂断流程

本文详细介绍了Android系统中单路通话挂断的流程,从Dialer应用的InCallFragment开始,经过InCallAdapter、CallsManager,深入到ConnectionService和IMS通话的处理。涉及的组件包括Call、InCallAdapter、ImsPhoneConnection、ImsCallSession等,并提到不同厂商(如MTK、QCOM、海思)对IMS的实现。此外,文章还提及了HIDL(硬件抽象层接口定义语言)在底层通信中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单路通话挂断流程

原生代码和rom厂商之间可能存在差异,我所了解到的,就是将dialer解耦一部分和通话界面相关的内容独立成一个应用。

首先我们先从界面上的挂断按钮的点击事件说起:
packages\apps\Dialer\java\com\android\incallui\incall\impl\InCallFragment.java

  public void onClick(View view) {
   
   
    if (view == endCallButton) {
   
   
      LogUtil.i("InCallFragment.onClick", "end call button clicked");
      Logger.get(getContext())
          .logImpression(DialerImpression.Type.IN_CALL_DIALPAD_HANG_UP_BUTTON_PRESSED);
      inCallScreenDelegate.onEndCallClicked();
    } else {
   
   
      LogUtil.e("InCallFragment.onClick", "unknown view: " + view);
      Assert.fail();
    }
  }

packages\apps\Dialer\java\com\android\incallui\CallButtonPresenter.java

  public void onEndCallClicked() {
   
   
    LogUtil.i("CallButtonPresenter.onEndCallClicked", "call: " + call);
    if (call != null) {
   
   
      call.disconnect();
    }
  }

packages\apps\Dialer\java\com\android\incallui\call\DialerCall.java

import android.telecom.Call;

  public void disconnect() {
   
   
    LogUtil.i("DialerCall.disconnect", "");
    setState(DialerCallState.DISCONNECTING);
    for (DialerCallListener listener : listeners) {
   
   
      listener.onDialerCallUpdate();
    }
    telecomCall.disconnect();
  }

frameworks\base\telecomm\java\android\telecom\Call.java

    private final InCallAdapter mInCallAdapter;

    public void disconnect() {
   
   
        mInCallAdapter.disconnectCall(mTelecomCallId);
    }

有多个InCallAdapter,因为Call中没有对InCallAdapter进行导包,所以使用到的应该是同包下的类
frameworks\base\telecomm\java\android\telecom\InCallAdapter.java

    private final IInCallAdapter mAdapter;

    public void disconnectCall(String callId) {
   
   
        try {
   
   
            mAdapter.disconnectCall(callId);
        } catch (RemoteException e) {
   
   
        }
    }

android\telecom\InCallAdapter到android\server\telecom是binder调用,我们就不细讲了
这个地方由FWK(框架层) —> APP(应用层)
packages\services\Telecomm\src\com\android\server\telecom\InCallAdapter.java

class InCallAdapter extends IInCallAdapter.Stub {
   
   }
    public void disconnectCall(String callId) {
   
   
        try {
   
   
            Log.startSession(LogUtils.Sessions.ICA_DISCONNECT_CALL, mOwnerPackageName);
            long token = Binder.clearCallingIdentity();
            try {
   
   
                synchronized (mLock) {
   
   
                    Log.v(this, "disconnectCall: %s", callId);
                    Call call = mCallIdMapper.getCall(callId);
                    if (call != null) {
   
   
                        mCallsManager.disconnectCall(call);
                    } else {
   
   
                        Log.w(this, "disconnectCall, unknown call id: %s", callId);
                    }
                }
            } finally {
   
   
                Binder.restoreCallingIdentity(token);
            }
        } finally {
   
   
            Log.endSession();
        }
    }

packages\services\Telecomm\src\com\android\server\telecom\CallsManager.java

    public void disconnectCall(Call call) {
   
   
        Log.v(this, "disconnectCall %s", call);

        if (!mCalls.contains(call)) {
   
   
            Log.w(this, "Unknown call (%s) asked to disconnect", call);
        } else {
   
   
            mLocallyDisconnectingCalls.add(call);
            call.disconnect();
            // Cancel any of the outgoing call futures if they're still around.
            if (mPendingCallConfirm != null && !mPendingCallConfirm.isDone()) {
   
   
                mPendingCallConfirm.complete(null);
                mPendingCallConfirm = null;
           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值