自定义消息通道

最近更新时间:2024-10-15 14:45:41

我的收藏
为方便 GME 开发者调试和接入腾讯云游戏多媒体引擎产品 API,本文为您介绍适用于 GME 用户自定义音频包附带消息功能的使用指引。

使用场景

GME 用户自定义音频包附带消息功能可以让开发者在 GME 音频包中携带自定义消息,作为信令传递广播给同房间的人。

前提条件

已开通实时语音服务:可参见 服务开通指引
已接入 GME SDK:包括核心接口和实时语音接口的接入,详情可参见 Native SDK 快速接入Unity SDK 快速接入Unreal SDK 快速接入

使用限制

调用此接口需要在房间类型为标准高清(ITMG_ROOM_TYPE_STANDARD 及 ITMG_ROOM_TYPE_HIGHQUALITY)的情况下,发送端需要打开麦克风,接收端需要打开扬声器。

自定义消息功能接入

发送自定义消息

接口原型

iOS
Android
Unity
-(int) SendCustomData:(NSData *)data repeatCout:(int)reaptCout;
public abstract int SendCustomData(byte[] data,int repeatCout);
public abstract int SendCustomData(byte[] customdata,int repeatCout);

参数说明

参数
类型
含义
data
NSData * 、byte[]
需要传递的信息
reaptCout
int
重复次数,填入-1为无限次重复发送

返回值

接口返回值为 QAV_OK 则表示成功。
回调返回1004表示参数错误,建议重新检查参数是否正确。返回1201表示房间不存在,建议检查房间号是否正确。
更多错误码请参见 错误码 文档。

示例代码

执行语句
iOS
Android
Unity
-(IBAction)SendCustData:(UIButton*)sender {
int ret = 0;
NSString *typeString;
switch (sender.tag) {
case 1:
ret = [[[ITMGContext GetInstance] GetRoom] SendCustomData:[NSData dataWithBytes:_shareRoomID.text.UTF8String length:_roomIdText.text.length] repeatCout:_shareOpenID.text.intValue];
typeString = @"sendCustData";
break;
case 2:
ret = [[[ITMGContext GetInstance] GetRoom] StopSendCustomData];
typeString = @"recvCustData";
break;
default:
break;
}
if(ret != 0) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"set fail" message:[NSString stringWithFormat:@"%@:errorcode :%d",typeString,ret] delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
}
String strData = mEditData.getText().toString();
String repeatCount = mEditRepeatCount.getText().toString();
int nRet = ITMGContext.GetInstance(getActivity()).GetRoom().SendCustomData(strData.getBytes(), Integer.parseInt(repeatCount));

InputField SendCustom_Count_InputField = transform.Find("inroomPanel/imPanel/SendCustom_Count_InputField").GetComponent<InputField>();
InputField SendCustom_Data_InputField = transform.Find("inroomPanel/imPanel/SendCustom_Data_InputField").GetComponent<InputField>();

transform.Find("inroomPanel/imPanel/SendCustom_Btn").GetComponent<Button>().onClick.AddListener(delegate ()
{
string data = SendCustom_Data_InputField.text;
string str_count = SendCustom_Count_InputField.text;
int count = 0;
if (int.TryParse(str_count, out count)) {
Debug.Log(data+ count.ToString());
byte[] byteData = Encoding.Default.GetBytes(data);
int ret = ITMGContext.GetInstance().GetRoom().SendCustomData(byteData, count);
if(ret != 0 ) {
ShowWarnning(string.Format("send customdata failed err:{0}",ret));
}
}
});
}
回调
iOS
Android
Unity
-(IBAction)SendCustData:(UIButton*)sender {
    int ret = ret = [[[ITMGContext GetInstance] GetRoom] SendCustomData:[NSData dataWithBytes:dataInput_textfiled_.text.UTF8String length:dataInput_textfiled_.text.length] repeatCout:-1];

    if(ret != 0) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"set fail" message:[NSString stringWithFormat:@"SendCustomData:errorcode :%d",ret] delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
    }
}
if (ITMGContext.ITMG_MAIN_EVENT_TYPE.ITMG_MAIN_EVENT_TYPE_CUSTOMDATA_UPDATE == type) {
int subtype = data.getIntExtra("sub_event",-1);
if (subtype == 0) {
String content = data.getStringExtra("content");
String sender = data.getStringExtra("senderid");
Toast.makeText(getActivity(), String.format("recv content =%s, from:%s", content,
sender), Toast.LENGTH_SHORT).show();
}
void OnEvent(int eventType,int subEventType,string data)
{
Debug.Log (data);
switch (eventType) {
case (int)ITMG_MAIN_EVENT_TYPE.ITMG_MAIN_EVENT_TYPE_CUSTOMDATA_UPDATE:
{
if(subEventType == (int)ITMG_CUSTOMDATA_SUB_EVENT.ITMG_CUSTOMDATA_AV_SUB_EVENT_UPDATE) {
_customData = JsonUtility.FromJson<CustomDataInfo>(data);
ShowWarnning(string.Format("recve customdata {0} from {1}",_customData.content,_customData.senderid));
}
}
break;
}

停止发送自定义消息

调用此接口停止发送自定义消息。

接口原型

iOS
Android
Unity
-(int) StopSendCustomData;
public abstract int StopSendCustomData();
public abstract int StopSendCustomData();

返回值

如果接口返回1003代表已经操作了 StopSendCustomData,SDK 正在进行这个操作,无需再次调用。