====== 实时通话 ====== ---- 实时通话分为视频通话和音频通话,与普通电话不同,它是基于网络的。 注:音视频通话功能最低支持android版本4.0+(14+) ===== 实时通话的数据流量 ===== 实时语音和实时视频的数据流量如下: * 实时语音:双向 170k bytes/minute * 实时视频:双向 2.5M~3M bytes/minute ===== 在 APP 中注册实时通话监听 ===== 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 ===== 视频通话相对复杂,把视频相关的一些 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。 ---- 上一页:[[start:200androidcleintintegration:75chatroom|聊天室管理]] 下一页:[[start:200androidcleintintegration:360androidradpakge|红包集成]]