实时通话


实时通话分为视频通话和音频通话,与普通电话不同,它是基于网络的。

注:音视频通话功能最低支持android版本4.0+(14+)

实时语音和实时视频的数据流量如下:

  • 实时语音:双向 170k bytes/minute
  • 实时视频:双向 2.5M~3M bytes/minute
IntentFilter callFilter = new IntentFilter(EMChatManager.getInstance().getIncomingCallBroadcastAction());
registerReceiver(new CallReceiver(), callFilter);

private class CallReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// 拨打方username
		String from = intent.getStringExtra("from");
		// call type
		String type = intent.getStringExtra("type");

	}
}
/**
* 设置通话状态监听
* @param listener
*/
EMChatManager.getInstance().addVoiceCallStateChangeListener(new EMCallStateChangeListener() {
    @Override
    public void onCallStateChanged(CallState callState, CallError error) {
        switch (callState) {
        case CONNECTING: // 正在连接对方
           
            break;
        case CONNECTED: // 双方已经建立连接
           
            break;

        case ACCEPTED: // 电话接通成功
           
            break;
        case DISCONNNECTED: // 电话断了

            break;
        case NETWORK_UNSTABLE: //网络不稳定
            if(error == CallError.ERROR_NO_DATA){
		//无通话数据
	    }else{
	    }
	    break;
	case NETWORK_NORMAL: //网络恢复正常
			
	    break;
        default:
            break;
        }

    }
});
/**
* 拨打语音通话
* @param to
* @throws EMServiceNotReadyException
*/
try {
	EMChatManager.getInstance().makeVoiceCall(username);
} catch (EMServiceNotReadyException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
/**
* 拨打视频通话
* @param to
* @throws EMServiceNotReadyException
*/
try {
	EMChatManager.getInstance().makeVideoCall(username);
} catch (EMServiceNotReadyException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
/**
* 接听通话
* @throws EMNoActiveCallException
* @throws EMNetworkUnconnectedException
*/
try {
	EMChatManager.getInstance().answerCall();
} catch (EMNoActiveCallException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (EMNetworkUnconnectedException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
/**
* 拒绝接听
* @throws EMNoActiveCallException
*/
try {
	EMChatManager.getInstance().rejectCall();
} catch (EMNoActiveCallException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
/**
* 挂断通话
*/
EMChatManager.getInstance().endCall();

暂停语音数据传输:

EMChatManager.getInstance().pauseVoiceTransfer()

恢复语音数据传输:

EMChatManager.getInstance().resumeVoiceTransfer()

暂停视频(图像)数据传输:

EMChatManager.getInstance().pauseVideoTransfer()

恢复视频(图像)数据传输:

EMChatManager.getInstance().resumeVideoTransfer()

调用后对方会收到相应 VOICE_PAUSE、VOICE_RESUME、VIDEO_PAUSE、VIDEO_RESUME 的 callstate 的变动通知。

视频通话相对复杂,把视频相关的一些 API 封装到了 EMVideoCallHelper 里。

常用方法如下(具体可参考 Demo 的 VideoCallActivity 和 CameraHelper):

//获取callHelper
callHelper = EMVideoCallHelper.getnstance();

//设置显示对方图像的surfaceview
callHelper.setSurfaceView(oppositeSurface);

//设置通话时的屏幕方向(注意在mainfest也需设置相应activity的方向,需和此保持一致)
callHelper.setVideoOrientation(EMVideoOrientation.EMLandscape);

//设置要传给对方的图像分辨率
callHelper.setResolution(mwidth, mheight);

//处理预览数据
callHelper.processPreviewData(mheight, mwidth, data);

//设置显示对方对象的surfaceview的宽、高及format
callHelper.onWindowResize(width, height, format);

//设置视频比特率,默认150
callHelper.setVideoBitrate(bitrate);

//截图
callHelper.takePicture(filepath);

//录制视频,参数为录制的文件存储目录
callHelper.startVideoRecord(dirPath);

//停止录制,此方法返回录制完成的视频的完整路径
callHelper.stopVideoRecord();

//码率自适应
EMChatManager.getInstance().setAdaptiveVideoFlag(true);

更多方法请参考 API Doc。


上一页:聊天室管理

下一页:红包集成