设为首页收藏本站

AnyChat技术支持论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 83193|回复: 107
打印 上一主题 下一主题

AnyChat视频呼叫业务逻辑详解

[复制链接]

5

主题

1269

帖子

3677

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3677
楼主
发表于 2013-9-10 10:55:44 | 显示全部楼层
本帖最后由 廖斌 于 2013-10-12 14:07 编辑

下面android端为例,展示实现视频呼叫业务逻辑的整个过程(代码仅供参考,根据实际情况调用)
一、设置呼叫回调事件接收
用户收到呼叫请求、请求回复、会话开始、会话结束等事件都是在呼叫回调事件中处理的。
1、首先要在目标activity中实现AnyChatVideoCallEvent接口
2、然后在接收之前设置回调接收anychat.SetVideoCallEvent(this);

二、发送呼叫请求
1、用户A请求呼叫用户B,调用如下代码:
  1. anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST, useridB, 0, 0,0, "usernameA")
复制代码
发送呼叫请求。
其中“AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST”为请求呼叫类型,“useridB”为用户B的userId,“usernameA”是自定义参数(这里可以传送A的userName)。
2、服务器接收到之后会判断B用户是否在线、是否正在呼叫,并返回“呼叫请求回复”给A,A触发OnAnyChatVideoCallEvent。
  1.         public void OnAnyChatVideoCallEvent(int dwEventType, final int dwUserId,
  2.                         int dwErrorCode, final int dwFlags, final int dwParam, final String userStr) {
  3.                 // TODO Auto-generated method stub
  4.                 switch(dwEventType)
  5.                 {
  6.                 case AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY:
  7.                         switch(dwErrorCode)
  8.                         {
  9.                         case AnyChatDefine.RETURNCODE_SUCCESS:
  10.                                 showToast("呼叫成功,请等待");
  11.                                  dialogCall=new ProgressDialog(this);
  12.                                 dialogCall.setMessage("呼叫成功,请等待");
  13.                         dialogCall.setButton("取消呼叫", new DialogInterface.OnClickListener() {
  14.                                 
  15.                                 @Override
  16.                                 public void onClick(DialogInterface dialog, int which) {
  17.                                         // TODO Auto-generated method stub
  18.                                         anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY, dwUserId, AnyChatDefine.RETURNCODE_SESSION_QUIT, dwFlags, 30, anychat.GetUserName(-1));
  19.                                 }
  20.                         });
  21.                                 dialogCall.show();
  22.                                 
  23.                                 break;
  24.                         case AnyChatDefine.RETURNCODE_SESSION_BUSY:
  25.                                 showToast("目标用户忙");
  26.                                 break;
  27.                         case AnyChatDefine.RETURNCODE_SESSION_DISCONNECT:
  28.                                 showToast("网络断线");
  29.                                 break;
  30.                         case AnyChatDefine.RETURNCODE_SESSION_OFFLINE:
  31.                                 showToast("目标用户不在线");
  32.                                 break;
  33.                         case AnyChatDefine.RETURNCODE_SESSION_QUIT:
  34.                                 showToast("源用户主动放弃会话");
  35.                                 break;
  36.                         case AnyChatDefine.RETURNCODE_SESSION_REFUSE:
  37.                                 showToast("目标用户拒绝会话");
  38.                                 if(dialogCall!=null)
  39.                                         dialogCall.dismiss();
  40.                                 break;
  41.                         case AnyChatDefine.RETURNCODE_SESSION_TIMEOUT:
  42.                                 showToast("会话请求超时");
  43.                                 break;
  44.                                 
  45.                                 
  46.                         }
  47.                         break;
复制代码
3、如B是空闲的,服务器会转发“请求指令”给B,B触发OnAnyChatVideoCallEvent
  1.         switch(dwEventType)
  2.                 {
  3.                 case AnyChatDefine.BRAC_VIDEOCALL_EVENT_REQUEST:
  4.                          dialogRequest = new AlertDialog.Builder(this).setPositiveButton("同意", new DialogInterface.OnClickListener() {
  5.                                        
  6.                                         @Override
  7.                                         public void onClick(DialogInterface dialog, int which) {
  8.                                                 // TODO Auto-generated method stub
  9.                                                 targetUserId=String.valueOf(dwUserId);
  10.                                                 anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY, dwUserId, AnyChatDefine.RETURNCODE_SUCCESS, dwFlags, 10, anychat.GetUserName(-1));
  11.                                         }
  12.                                 }).setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
  13.                                        
  14.                                         @Override
  15.                                         public void onClick(DialogInterface dialog, int which) {
  16.                                                 // TODO Auto-generated method stub
  17.                                                 Log.i("ANYCHAT", "REPLY:"+"EVENT:"+AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY+"dwUserId:"+dwUserId+"ERRORCODE:"+AnyChatDefine.RETURNCODE_SESSION_REFUSE+"NAME:"+anychat.GetUserName(-1));
  18.                                                 anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY, dwUserId, AnyChatDefine.RETURNCODE_SESSION_REFUSE, dwFlags, 20, anychat.GetUserName(-1));
  19.                                         }
  20.                                 }).setMessage(userStr+":请求通话").create();
  21.                          dialogRequest.show();
复制代码
三、呼叫请求回复
B收到“请求指令之后”之后,可以回复A的请求。
1、同意通话,调用
  1.         anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY, useridA, AnyChatDefine.RETURNCODE_SUCCESS, dwFlags, 10, anychat.GetUserName(-1));
复制代码
其中useridA为用户A的userId,10、anychat.GetUserName(-1)都是用户自定义参数
2、拒绝通话,调用
anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY, useridA, AnyChatDefine.RETURNCODE_SESSION_REFUSE, dwFlags, 20, anychat.GetUserName(-1));
其中useridA为用户A的userId,20、anychat.GetUserName(-1)都是用户自定义参数。A端触发OnAnyChatVideoCallEvent,可以得知B拒绝通话
  1.         case AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY:
  2.                         switch(dwErrorCode)
  3.                         {
  4.                         case AnyChatDefine.RETURNCODE_SESSION_REFUSE:
  5.                                 showToast("目标用户拒绝会话");
  6.                                 if(dialogCall!=null)
  7.                                         dialogCall.dismiss();
  8.                                 break;
复制代码
3、取消呼叫
A端此时可以取消呼叫,调用
  1. anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY, useridB, AnyChatDefine.RETURNCODE_SESSION_QUIT, dwFlags, 30, anychat.GetUserName(-1));
复制代码
B端将触发OnAnyChatVideoCallEvent
  1.         case AnyChatDefine.BRAC_VIDEOCALL_EVENT_REPLY:
  2.                         switch(dwErrorCode)
  3.                         {
  4.                         case AnyChatDefine.RETURNCODE_SESSION_QUIT:
  5.                                 showToast("源用户主动放弃会话");
  6.                                 break;
复制代码
四、会话开始
B端发送“同意会话回复”之后,服务器端将向A、B同时发送“会话开始”指令,A和B将触发OnAnyChatVideoCallEvent
  1. public void OnAnyChatVideoCallEvent(int dwEventType, final int dwUserId,
  2.                         int dwErrorCode, final int dwFlags, final int dwParam, final String userStr) {
  3.                 // TODO Auto-generated method stub
  4.                 switch(dwEventType)
  5.                 {
  6.                 case AnyChatDefine.BRAC_VIDEOCALL_EVENT_START:
  7.                         anychat.LeaveRoom(-1);
  8.                          Intent intent=new Intent();
  9.                            intent.putExtra("UserID",targetUserId);
  10.                            intent.putExtra("ROOMID",dwParam);
  11.                            intent.setClass(RoomActivity.this, VideoActivity.class);
  12.                        startActivity(intent);
  13.                         break;
复制代码
其中dwParam是roomId,A和B收到之后可以进入同一房间进行音视频通话。

五、会话结束
B或者A任何一方发送会话结束指令,调用
  1. anychat.VideoCallControl(AnyChatDefine.BRAC_VIDEOCALL_EVENT_FINISH, userID, 0, 0, 0, "");
复制代码
其中userID为对方的useId.此时A、B将会触发“呼叫结束事件”OnAnyChatVideoCallEvent
  1. public void OnAnyChatVideoCallEvent(int dwEventType, int dwUserId,
  2.                         int dwErrorCode, int dwFlags, int dwParam, String userStr) {
  3.                 // TODO Auto-generated method stub
  4.                 public void OnAnyChatVideoCallEvent(int dwEventType, final int dwUserId,
  5.                         int dwErrorCode, final int dwFlags, final int dwParam, final String userStr) {
  6.                 // TODO Auto-generated method stub
  7.                 switch(dwEventType)
  8.                 {
  9. case AnyChatDefine.BRAC_VIDEOCALL_EVENT_FINISH:
  10.                         Toast.makeText(this, "通话结束",Toast.LENGTH_LONG).show();
  11.                         this.finish();
  12.                 }
复制代码
六、附录,errorcode定义
        public static final int RETURNCODE_SUCCESS=0;
        public static final int RETURNCODE_SESSION_QUIT = 100101;// 源用户主动放弃会话
        public static final int RETURNCODE_SESSION_OFFLINE = 100102;// 目标用户不在线
        public static final int RETURNCODE_SESSION_BUSY = 100103;// 目标用户忙
        public static final int RETURNCODE_SESSION_REFUSE = 100104;// 目标用户拒绝会话
        public static final int RETURNCODE_SESSION_TIMEOUT = 100105;//会话请求超时
        public static final int RETURNCODE_SESSION_DISCONNECT= 100106;// 网络断线
回复 支持 反对

使用道具 举报

5

主题

1269

帖子

3677

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3677
沙发
发表于 2013-10-11 16:50:45 | 显示全部楼层
KeepGoing2013 发表于 2013-10-11 16:34
服务器端是最新版本
android客户端是我下载官方demo后修改的
官方demo中点击用户执行以下方法, 但对方 ...

可以的。android业务流程描述中的代码还没有更新到网上,还是老的代码
回复 支持 反对

使用道具 举报

5

主题

1269

帖子

3677

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3677
板凳
发表于 2013-10-11 17:05:04 | 显示全部楼层
您设置的SetVideoCallEvent在什么地方呢?另外最新的核心服务器才支持业务呼叫逻辑,你连接的服务器是什么版本的?
回复 支持 反对

使用道具 举报

5

主题

1269

帖子

3677

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3677
地板
发表于 2013-10-11 17:21:01 | 显示全部楼层
恩。可以将您的服务器日志发上来看下。另外可以将VideoCallControl的返回值输出下看看
回复 支持 反对

使用道具 举报

5

主题

1269

帖子

3677

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3677
5#
发表于 2013-10-12 11:51:16 | 显示全部楼层
您好。targetUserId是目标对象的用户id,比如说A呼叫B,那么A中回调中targetUserId就是B的userid。dwParam是房间号。A和B双方收到房间号后。进入共同的房间。需要在VideoActivity进入共同房间,然后打开自己和他人的音视频。
回复 支持 反对

使用道具 举报

5

主题

1269

帖子

3677

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3677
6#
发表于 2013-10-12 13:45:24 | 显示全部楼层
anychat.UserCameraControl(userID, 1);
                anychat.UserSpeakControl(userID, 1);
                anychat.UserCameraControl(-1, 1);
                anychat.UserSpeakControl(-1, 1);        
需要在进入房间成功之后调用才有效。呼叫成功之后,服务器分配了一个ROOMID,你进入了吗?
回复 支持 反对

使用道具 举报

5

主题

1269

帖子

3677

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3677
7#
发表于 2013-10-12 14:29:12 | 显示全部楼层
在线人员列表中是另外一个房间。比如说是2号。呼叫成功之后服务器会分配一个房间4。先离开2号房间,然后同时进入4号房间(我的代码描述有一个离开房间的操作,然后跳转到VideoActivity,你可以在进入服务器分配的房间成功之后再跳转到vidoactivity中。进入房间成功,会触发onAnyChatEnterRoom)
回复 支持 反对

使用道具 举报

5

主题

1269

帖子

3677

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3677
8#
发表于 2013-10-14 13:52:50 | 显示全部楼层
您好。竖屏的时候,远程视频可以按下面方法调节
您好,这属于设备方向的相关问题,您可以通过如下步骤来设置:

1、开启设备方向自适应功能,在初始化SDK成功之后调用如下的代码:// 设备方向自适应

AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_AUTOROTATION, 1);
2、屏蔽设备方向改变事件,可修改【src\com\bairuitech\anychat\AnyChatSensorHelper.java】中的【onOrientationChanged】方法,删除该方法中的代码,可直接return。

3、设置合适的设备方向,在打开摄像头之前调用如下的代码:// 设置设备方向(orientation取值范围:0 ~ 6)

AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ORIENTATION, orientation);

orientation取值范围:0 ~ 6,都试过了吗?

回复 支持 反对

使用道具 举报

5

主题

1269

帖子

3677

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3677
9#
发表于 2013-10-14 15:08:22 | 显示全部楼层
1、可以,也可以在loginactivy调用anychat.InitSDK之后调用
3、可以,也可以在loginactivy调用anychat.InitSDK之后调用
回复 支持 反对

使用道具 举报

5

主题

1269

帖子

3677

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3677
10#
发表于 2013-10-15 10:35:53 | 显示全部楼层
如果按上面部署来做,orientation取值范围:0 ~ 6都试过了的话,那么具体问题得看代码了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|AnyChat ( 粤ICP备13022410号-1 )  

GMT+8, 2024-5-3 01:20 , Processed in 0.127520 second(s), 21 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表