通话状态监听 CallKit 和 CallLib 的不同实现

发布时间: 2021-11-26 18:53

回答:

一、CallKit 

官网开发文档:https://doc.rongcloud.cn/call/Android/5.X/callkit/integration#callee 

如果开发者是以源码的方式集成的 CallKit ,可以通过修改 RongCallProxy.java 的代码,实现自己应用的监听(如 通话结束的回调监听)。修改完下述方法后,在您的应用里调用 setAppCallListener() 设置您自己的监听。

示例如下:

public class RongCallProxy implements IRongCallListener {

      private IRongCallListener mCallListener;  // 增加一个监听。

      /*设置自己应用的监听*/
      public void setAppCallListener(IRongCallListener listener) {
          this.mAppCallListener = listener;
      }

      /*修改对应的通话状态回调的方法,使其回调到您设置的应用自身的监听*/
      @Override
      public void onCallDisconnected(RongCallSession callSession, RongCallCommon.CallDisconnectedReason reason) {
          if (mCallListener != null) {
              mCallListener.onCallDisconnected(callSession, reason);
          }
          /*增加的代码,回调应用设置的监听*/
          if(mAppCallListener != null) {
              mAppCallListener.onCallDisconnected(callSession, reason);
          }
      }
... // 根据您的需要,同样的方式修改其它通话状态回调函数。
  }


二、CallLib

官网开发文档:https://doc.rongcloud.cn/call/Android/5.X/calllib/control/listener

 calllib 中的 RongCallClient.getInstance().setVoIPCallListener(new IRongCallListener() {...} 来监听通话结束,且需要您自己来实现通话 UI ( CallKit 的功能 )了。

RongCallClient.getInstance().setVoIPCallListener(new IRongCallListener() {
        /**
         * 电话已拨出。
         * 主叫端拨出电话后,通过回调 onCallOutgoing 通知当前 call 的详细信息。
         *
         * @param callSession 通话实体。
         * @param localVideo  本地 camera 信息。
         */
        @Override
        public void onCallOutgoing(RongCallSession callSession, SurfaceView localVideo) {}

        /**
         * 已建立通话。
         * 通话接通时,通过回调 onCallConnected 通知当前 call 的详细信息。
         *
         * @param callSession 通话实体。
         * @param localVideo  本地 camera 信息。
         */
        @Override
        public void onCallConnected(RongCallSession callSession, SurfaceView localVideo) {}

        /**
         * 通话结束。
         * 通话中,对方挂断,己方挂断,或者通话过程网络异常造成的通话中断,都会回调 onCallDisconnected。
         *
         * @param callSession 通话实体。
         * @param reason      通话中断原因。
         */
        @Override
        public void onCallDisconnected(RongCallSession callSession, RongCallCommon.CallDisconnectedReason reason) {}

        /**
         * 被叫端正在振铃。
         * 主叫端拨出电话,被叫端收到请求,发出振铃响应时,回调 onRemoteUserRinging。
         *
         * @param userId 振铃端用户 id。
         */
        @Override
        public void onRemoteUserRinging(String userId) {}

        /**
         * 被叫端加入通话。
         * 主叫端拨出电话,被叫端收到请求后,加入通话,回调 onRemoteUserJoined。
         *
         * @param userId      加入用户的 id。<br />
         * @param mediaType   加入用户的媒体类型,audio or video。<br />
         * @param userType    加入用户的类型,1:正常用户,2:观察者。<br />
         * @param remoteVideo 加入用户者的 camera 信息。如果 userType为2,remoteVideo对象为空;<br />
         *                    如果对端调用{@link RongCallClient#startCall(int, boolean, Conversation.ConversationType, String, List, List, RongCallCommon.CallMediaType, String, StartCameraCallback)} 或
         *                    {@link RongCallClient#acceptCall(String, int, boolean, StartCameraCallback)}开始的音视频通话,则可以使用如下设置改变对端视频流的镜像显示:<br />
         *                    <pre class="prettyprint">
         *                                            public void onRemoteUserJoined(String userId, RongCallCommon.CallMediaType mediaType, int userType, SurfaceView remoteVideo) {
         *                                                 if (null != remoteVideo) {
         *                                                     ((RongRTCVideoView) remoteVideo).setMirror( boolean);//观看对方视频流是否镜像处理
         *                                                 }
         *                                            }
         *                                            </pre>
         */
        @Override
        public void onRemoteUserJoined(String userId, RongCallCommon.CallMediaType mediaType, int userType, SurfaceView remoteVideo) {}

        /**
         * 通话中的某一个参与者,邀请好友加入通话,发出邀请请求后,回调 onRemoteUserInvited。
         * @param userId 被邀请者的ID ,可以通过RongCallClient.getInstance().getCallSession().getObserverUserList().contains(userId) ,查看加入的用户是否在观察者列表中
         * @param mediaType
         */
        @Override
        public void onRemoteUserInvited(String userId, RongCallCommon.CallMediaType mediaType) {}

        /**
         * 通话中的远端参与者离开。
         * 回调 onRemoteUserLeft 通知状态更新。
         *
         * @param userId 远端参与者的 id。
         * @param reason 远端参与者离开原因。
         */
        @Override
        public void onRemoteUserLeft(String userId, RongCallCommon.CallDisconnectedReason reason) {}

        /**
         * 当通话中的某一个参与者切换通话类型,例如由 audio 切换至 video,回调 onMediaTypeChanged。
         *
         * @param userId    切换者的 userId。
         * @param mediaType 切换者,切换后的媒体类型。
         * @param video     切换者,切换后的 camera 信息,如果由 video 切换至 audio,则为 null。
         */
        @Override
        public void onMediaTypeChanged(String userId, RongCallCommon.CallMediaType mediaType, SurfaceView video) {}

        /**
         * 通话过程中,发生异常。
         *
         * @param errorCode 异常原因。
         */
        @Override
        public void onError(RongCallCommon.CallErrorCode errorCode) {}

        /**
         * 远端参与者 camera 状态发生变化时,回调 onRemoteCameraDisabled 通知状态变化。
         *
         * @param userId   远端参与者 id。
         * @param disabled 远端参与者 camera 是否可用。
         */
        @Override
        public void onRemoteCameraDisabled(String userId, boolean disabled) {}

        /**
         * 远端参与者 麦克风 状态发生变化时,回调 onRemoteMicrophoneDisabled 通知状态变化。
         *
         * @param userId   远端参与者 id。
         * @param disabled 远端参与者 Microphone 是否可用。
         */
        @Override
        public void onRemoteMicrophoneDisabled(String userId, boolean disabled) {}

        /**
         * 接收丢包率信息回调
         *
         * @param userId   远端用户的ID
         * @param lossRate 丟包率:0-100
         */
        @Override
        public void onNetworkReceiveLost(String userId, int lossRate) {}

        /**
         * 发送丢包率信息回调
         *
         * @param lossRate 丢包率,0-100
         * @param delay 发送端的网络延迟
         */
        @Override
        public void onNetworkSendLost(int lossRate, int delay) {}

        /**
         * 收到某个用户的第一帧视频数据
         *
         * @param userId
         * @param height
         * @param width
         */
        @Override
        public void onFirstRemoteVideoFrame(String userId, int height, int width) {}
        /**
         * 本端音量大小回调
         *
         * @param audioLevel
         */
        @Override
        public void onAudioLevelSend(String audioLevel) {}

        /**
         * 对端音量大小回调
         *
         * @param audioLevel  key:userId , value:音量等级
         */
        @Override
        public void onAudioLevelReceive(HashMap<String, String> audioLevel) {}

        /**
         * 远端用户发布了自定义视频流
         * <p>调用RongCallClient.getInstance().publishCustomVideoStream(String tag, publishCallBack callBack) 方法发布自定义视频流</p>
         * @param userId 用户 ID
         * @param streamId 自定义视频流 id
         * @param tag   自定义视频流 tag
         * @param surfaceView   自定义视频流视图
         */
        @Override
        public void onRemoteUserPublishVideoStream(String userId, String streamId, String tag, SurfaceView surfaceView) {}

        /**
         * 远端用户取消发布自定义视频流
         * @param userId    用户 ID
         * @param streamId  自定义视频流 id
         * @param tag   自定义视频流 tag
         */
        @Override
        public void onRemoteUserUnpublishVideoStream(String userId, String streamId, String tag) {}
    });