跳到主要内容

通话监听

融云 CallLib 库提供了 IRongReceivedCallListenerIRongCallListener 两个类, 用于处理呼叫相关的业务逻辑上报。

来电监听

需要设置 CallLib 的全局通话监听 IRongReceivedCallListener,来监听通话呼入。

  1. 调用 RongCallClient 中的 setReceivedCallListener 来监听通话呼入。

    RongCallClient.setReceivedCallListener(new IRongReceivedCallListener() {
    /**
    * 来电回调
    * @param callSession 通话实体
    */
    @Override
    public void onReceivedCall(RongCallSession callSession) {
    }

    /**
    * targetSDKVersion 大于等于 23 时检查权限的回调。当 targetSDKVersion 小于 23 的时候不需要实现。
    * 在这个回调里用户需要使用Android6.0新增的动态权限分配接口通知用户授权,
    * 然后根据用户授权或者不授权分别回调
    * RongCallClient.getInstance().onPermissionGranted()和
    * RongCallClient.getInstance().onPermissionDenied()来通知CallLib。
    *
    * @param callSession 通话实体
    */
    @Override
    public void onCheckPermission(RongCallSession callSession) {
    }
    });
  2. 如果应用需要支持 Android 6.0(API 级别 23)或更高版本的设备,请在 onCheckPermission 回调中通过被叫用户,请求授予摄像头(CAMERA)、麦克风(RECORD_AUDIO)权限,并将结果通知 CallLib。

    • 授权后,通知 CallLib。SDK 会触发来电监听的 onReceivedCall 回调。

      RongCallClient.getInstance().onPermissionGranted();
    • 拒绝授权后,通知 CallLib。此时主叫端会触发通话状态监听的 onCallDisconnected 方法结束呼叫。原因为 REMOTE_REJECT(12) 对方拒绝。

      RongCallClient.getInstance().onPermissionDenied()

通话状态监听

设置通话状态的回调 IRongCallListener,来监听通话状态的变化。

RongCallClient.getInstance().setVoIPCallListener(new IRongCallListener() {
//
});

具体支持监听的事件请参见下方介绍的回调方法。

通话建立、结束等状态相关的回调

  • 电话已拨出,返回当前通话的详细信息。
  • 已建立通话,返回当前通话的详细信息。
  • 通话结束。对方挂断,己方挂断,或者通话过程网络异常造成的通话中断,都会通过同一个回调返回原因(RongCallCommon.CallDisconnectedReason)。
  • 被叫端正在振铃,返回振铃用户的用户 ID。
  • 被叫端加入通话,返回加入者的用户信息和摄像头信息。
  • 通话中的某一个参与者,邀请好友加入通话。返回被邀请者的信息和媒体类型。
  • 通话中的远端参与者离开,返回离开者的信息和离开原因(RongCallCommon.CallDisconnectedReason)。在多人通话与 1v1 通话中,对端挂断均会先回调 onRemoteUserLeft,再触发其他回调。
  • 当通话中的某一个参与者切换通话类型,例如由视频切换至音频。返回切换操作者的信息、切换后的媒体类型等。
  • 通话过程中,发生异常。返回错误码(RongCallCommon.CallErrorCode)。
/**
* 电话已拨出。
* 主叫端拨出电话后,通过回调 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) {}

设备相关回调

  • 远端参与者摄像头状态发生变化时,回调 onRemoteCameraDisabled 通知状态变化。
  • 远端参与者麦克风状态发生变化时,回调 onRemoteMicrophoneDisabled 通知状态变化。
/**
* 远端参与者 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) {}

网络质量相关回调

  • 接收丢包率信息回调,返回远端用户 ID 及丢包率。
  • 发送丢包率信息回调,返回丢包率及发送端的网络延迟。
  • 收到某个用户的第一帧视频数据,返回用户信息及宽高数据。
/**
* 接收丢包率信息回调
*
* @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) {}