安卓端如何实现不依赖群组的实时音视频通话?

安卓端如何实现不依赖群组的实时音视频通话?
发布时间: 2018-01-19 18:09

回答:

说明  


 要实现不依赖群组的多人实时音视频通话,需要开发者的客户端和服务器端分别实现对应的逻辑。

 融云客户端SDK发送消息有频率限制,1s内允许最大发送5条IM消息,此方案的核心思想是由app server帮助客户端  发送多人音视频通话涉及的IM信令消息。


app server端 


开发者的app server端需要提供2个接口给客户端(2.9.0版本以上SDK提供1个发送单聊消息的接口即可) 

1.生成mediaId

mediaId要求一个全局唯一的整数,且 0 < mediaId < 0x7ffffff

注意,此接口供融云 SDK 2.8.32以下版本使用(agora引擎),2.9.0以上版本SDK可以不实现(blink引擎和rtc引擎) 

关于不同引擎说明,可参考知识库(https://support.rongcloud.cn/ks/ODg5)

2.发送单聊消息

发送单聊消息的IM Server API文档为(https://www.rongcloud.cn/docs/server.html#message_private_publish)

发送单聊消息的参数由开发者的客户端提供 

调用IM Server API 通过private消息发送实时音视频相关IM信令消息,需要特别注意以下参数:

fromUserId=当前用户(自己)的id
toUserId=参会者1&toUserId=参会者2 // 除自己外的,所有参会者拼在一起
isPersisted=0
isCounted=0
isIncludeSender=0


客户端 


1.实现io.rong.calllib.IRongCallSignalSender接口,实现时应当调用开发者的app server端api,参考代码如下:

public class CallSignalSender implements IRongCallSignalSender {

    private final static String MEDIA_ID = "/call/voip/media_id";
    private final static String MESSAGE_SENDER = "/misc/messages";

    HttpClientHelper httpClientHelper;

    public CallSignalSender(HttpClientHelper httpClientHelper) {
        this.httpClientHelper = httpClientHelper;
    }

    public void getMediaId(final IRongCallSignalSender.GetMediaIdCallback callback) {
        //调用app server接口获取meidaId,2.9.0以上SDK可以不实现此接口,直接返回0
        //callback.onGotMediaId(0 + "");
        httpClientHelper.get(MEDIA_ID, new HttpClientHelper.Callback<Integer>() {
            @Override
            public void onSuccess(Integer mediaIdInfo) {
                callback.onGotMediaId("" + mediaIdInfo);
            }

            @Override
            public void onFail(RceErrorCode errorCode) {
                callback.onError(-1);
            }
        });
    }

    public void sendSignal(List<String> targetUserIds, Message message, String pushContent, String pushData, final IRongCallSignalSender.SendSignalCallback callback) {
       //调用app server接口发送IM信令消息
       //map数据为app server调用IM server api发送IM单聊消息的参数,客户端直接复制此段代码即可
        Map<String, Object> map = new HashMap<>();
        map.put("conversation_type", Conversation.ConversationType.PRIVATE.getValue() + "");
        map.put("target_ids", targetUserIds);
        map.put("object_name", message.getObjectName());
        map.put("content", new String(message.getContent().encode()));
        map.put("push_content", pushContent);
        map.put("push_data", pushData);
        map.put("persisted", false);
        map.put("include_sender", 0);

        httpClientHelper.post(MESSAGE_SENDER, map, new HttpClientHelper.Callback<GsonBaseInfo>() {
            @Override
            public void onSuccess(GsonBaseInfo gsonBaseInfo) {
                if (callback != null) {
                    callback.onSuccess();
                }
            }

            @Override
            public void onFail(RceErrorCode errorCode) {
                if (callback != null) {
                    callback.onError(-1);
                }
            }
        });

    }
}


2.设置CallSignalSender 

在融云SDK init之后调用接口

RongCallClient.setCallSignalSender(IRongCallSignalSender signalSender)


3.如果使用calllib或者开发者实现通话界面 

则调用如下方法开始不基于群组的多人voip:

//converationType必须传NONE,targeId为null即可,invitedList为多人音视频通话的参与者
RongCallClient.getInstance().startCall(Conversation.ConversationType.NONE, null, invitedList,null, RongCallCommon.CallMediaType.VIDEO,  null);


4.使用callkit的通话界面 调用如下方法即可

/**
 * 发起的多人通话,不依赖群、讨论组等
 *
 * @param context
 * @param mediaType
 * @return
 */
public static void startMultiCall(final Context context, ArrayList<String> userIds, final CallMediaType mediaType)
我对此仍有疑问!继续追问