实时通话分为视频通话和音频通话,与普通电话不同,它是基于网络的。
注:音视频通话功能最低支持android版本4.0+(14+)
实时语音和实时视频的数据流量如下:
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。