云游戏手游 Message Channel SDK 为部署在火山引擎云游戏环境的游戏与云游戏客户端 APP 提供消息传输的系统解决方案,可以支持免登、支付和客户端与云端应用的互动等场景。
集成云游戏手游 Message Channel SDK 的宿主 APP 需为 Android 环境运行的程序(有关云游戏客户端 veGameSDK 的使用方法,参考 Android SDK 接口说明。
本文档描述了 Message Channel SDK 的使用说明,方便您快速接入。
Message Channel SDK V1.0.9.2 版本的发布说明如下:
Message Channel SDK V1.0.10 版本的发布说明如下:
Message Channel SDK V1.0.9 版本的发布说明如下:
options
参数,支持收发文件时传输自定义参数。Message Channel SDK V1.0.8 版本的发布说明如下:
Message Channel SDK V1.0.7-lite 版本的发布说明如下:
Message Channel SDK V1.0.7 版本的发布说明如下:
requestGeneralData
)。详细信息,参考 请求通用信息数据。Message Channel SDK V1.0.6 版本的发布说明如下:
timeout
参数,支持指定消息发送超时时长。详细信息,参考 云端游戏发送消息给客户端。Message Channel SDK V1.0.5 版本的发布说明如下:
sendMessage
接口新增 destChannelUid
可选参数,用于指定云端游戏初始化 veMessageChannelClient 时填入的用户 ID。stop
接口停止拉流、客户端和云端游戏之间已建立的消息通道连接断开;当客户端调用 start
接口重新启动游戏后,veMessageChannelClient 会主动恢复客户端和云端游戏之间的消息通道连接。Message Channel SDK 目前不支持本地调试,您可以参考 demo 自行搭建测试环境。
支持 Android 4.1(API 级别 16)及以上系统。
添加 Maven 仓库地址
确保 Project 根目录下的 build.gradle
文件中的 repositories
中配置了 maven 仓库地址,参考以下示例:
buildscript { repositories { maven { url 'https://artifact.bytedance.com/repository/Volcengine/' } } } allprojects { repositories { maven { url 'https://artifact.bytedance.com/repository/Volcengine/' } } }
添加 SDK 依赖
在应用模块的 build.gradle
文件中的 dependencies
中添加 SDK 依赖,参考以下示例:
implementation 'com.bytedance.message:VeMsgChannelClient:1.0.9.2'
需要设置 Java 版本到1.8,参考以下示例:
android { // ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
权限声明
根据实际场景在 AndroidManifest.xml
文件中声明 SDK 需要的权限,参考以下示例:
//读写存储 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
说明:
- 存储写入权限需动态申请。参考:https://developer.android.com/training/permissions/requesting
- 如果 App 指向 Android 10 以上 (targetSdkVersion >= 29),而且还未适配 “Scoped Storage”。请将
AndroidManifest.xml
中的requestLegacyExternalStorage
设置为true
。参考: https://developer.android.com/training/data-storage/use-cases#opt-out-scoped-storage<manifest> <application android:requestLegacyExternalStorage="true"> </application> </manifest>
描述: 初始化,创建与服务的连接。方法如下:
void init(Context context, String userId, String accessKey, IMessageHandler handler)
参考示例:
VeMessageChannelClient.getInstance().init(context, userId, accessKey, handler)
参数说明:
参数名 | 类型 | 是否必选 | 描述 |
---|---|---|---|
context | Context | 是 | 上下文信息,建议填写 Application Context |
userId | String | 是 | (一般情况下,建议使用应用包名)在多用户场景时,用于指定用户的唯一标识 |
accessKey | String | 是 | 在建立连接时用于鉴权,目前采用的鉴权方式为 md5(PackageName) (注:需注意包名的大小写一致,例如,应用包名为:com.Android.Demo ,则对应的 accessKey 为 md5("com.Android.Demo") |
handler | IMessageHandler | 是 | 初始化结果回调,参考以下 IMessageHandler 回调说明 |
IMessageHandler 回调说明
方法 | 返回值 | 参数说明 | 描述 |
---|---|---|---|
onInitSuccess() | void | 空 | 初始化成功回调 |
onFailed() | void |
| 运行过程中发生的失败回调 |
onSendResult() | void |
| 消息发送结果回调 |
onReceivedMessage() | void |
| 收到对端发送过来的消息 |
onReceivedBinaryMessage() | void |
| 收到对端发送过来的二进制消息 |
onConnectionStateChanged() | void | state: Integer,通道连接状态码,参考 状态说明 | 通道连接状态变化监听 |
描述: 云端游戏发送文本消息给云游戏客户端 APP。方法如下:
VeMessage sendMessageToClient(String message, boolean needsAck, long timeout)
参考示例:
VeMessageChannelClient.getInstance().sendMessageToClient("message", true, 6000);
参数说明:
参数名 | 类型 | 是否必选 | 描述 |
---|---|---|---|
message | String | 是 | 发送的文本消息内容 |
needsAck | Boolean | 是 | 是否需要回执:
|
timeout | Long | 是 | 消息发送超时时长,单位 ms(需要大于0;当超过 timeout 指定的时间客户端仍然未收到消息,通过 IMessageHandler.onSendResult 返回消息发送失败信息) |
描述: 云端游戏发送二进制数据给云游戏客户端APP。方法如下:
VeBinaryMessage sendBinaryMessageToClient(byte[] payload, boolean needAck, `long timeout`)
参考示例:
VeMessageChannelClient.getInstance().sendBinaryMessageToClient(payload, true, 6000);
参数说明:
参数名 | 类型 | 是否必选 | 描述 |
---|---|---|---|
payload | byte[] | 是 | 发送的二进制数组 |
needsAck | Boolean | 是 | 是否需要回执:
|
timeout | Long | 是 | 消息发送超时时长,单位 ms(需要大于0;当超过 timeout 指定的时间客户端仍然未收到消息,通过 IMessageHandler.onSendResult 返回消息发送失败信息) |
详情见 初始化 章节中的 IMessageHandler.onReceivedMessage()
。
详细信息,参考 初始化章节 中的 IMessageHandler.onReceivedBinaryMessage()
说明。
描述: 获取客户端在启动游戏时发送到云端的通用信息数据(即通过开始游戏接口的 extra
参数发送的数据)。方法如下:
VeMessageChannelClient.getInstance().requestGeneralData(String cmd, IGeneralDataHandler handler)
参数说明:
参数名 | 类型 | 是否必选 | 描述 |
---|---|---|---|
cmd | String | 是 | 命令,参考以下 Constant 说明 |
handler | IGeneralDataHandler | 是 | 通用信息数据请求结果回调,参考以下 IGeneralDataHandler 回调说明 |
参考示例:
/** * 请求通用信息数据 * * @param cmd value of {@link Constant#GENERAL_CMD_GET_EXTRA} */ public void requestGeneralData(String cmd, IGeneralDataHandler handler) { if (mMessageChannelDelegate == null || handler == null) { return; } if (TextUtils.isEmpty(cmd)) { handler.onGeneralDataBack("Bad cmd !"); return; } mMessageChannelDelegate.sendCommandToSystem(new VeCmd(cmd)); }
Constant 说明:
/** * Request general data cmd: get extra */ public static final String GENERAL_CMD_GET_EXTRA = "get_extra";
IGeneralDataHandler 回调说明:
public interface IGeneralDataHandler { /** * 通过此接口返回由 {@link VeMessageChannelClient#requestGeneralData(String, IGeneralDataHandler)}请求的数据 * * @param result 结果-Error code * 1: <li>{@link #ERROR_CODE_SUCCESS}<li/> * 2: <li>{@link #ERROR_CODE_FAILED_INVALID_CMD}<li/> * 3: <li>{@link #ERROR_CODE_FAILED_NO_CONNECTION}<li/> * @param data 异步返回请求的通用数据 */ void onGeneralDataBack((int result,String data); }
描述:云游戏客户端与云端游戏之间收发文件。方法如下:
/** * 云端游戏向客户端发送大文件 * * @param filePath 本地文件绝对路径 * @param options 自定义参数,由云端 App 发送到客户端,可以为空 * @return 0-成功,1-失败,2-未连接 * @apiNote veGameSDK Version >= 1.21.0 * */ public int sendFile(String filePath, Map<String, String> options) { return transFileCmd(filePath, Constant.GENERAL_CMD_SEND_FILE); }
/** * 停止发送中的文件 * * @param filePath 本地文件绝对路径 * @return 0-成功,1-失败,2-未连接 * @apiNote veGameSDK Version >= 1.19.0 * */ public int cancelSendFile(String filePath) { return transFileCmd(filePath, Constant.GENERAL_CMD_CANCEL_FILE); }
/** * 设置文件发送/接收结果监听 * * @param listener 接收大文件传输结果回调 */ public void setFileTransportResultListener(IFileTransportResultListener listener) { if (mMessageChannelDelegate != null) { mMessageChannelDelegate.setFileTransportResultListener(listener); } }
IFileTransportResultListener 回调说明
public interface IFileTransportResultListener { /** 发送/接收文件 成功 */ int RESULT_SUCCESS = 0; /** 发送/接收文件 失败 */ int RESULT_FAILED = 1; /** 发送/接收文件 取消 */ int RESULT_CANCEL = 2; /** 表示本次文件发送由云端游戏发起 */ int FLAG_SENDER_CLOUD_APP = 5; /** 表示本次文件发送由客户端发起 */ int FLAG_SENDER_VE_SDK = 6; /** * 云端游戏发起,调用大文件发送接口{@link VeMessageChannelClient#sendFile(String)}结果回调 * * @param result 结果- code * <li>{@link #RESULT_SUCCESS}<li/> * <li>{@link #RESULT_FAILED}<li/> * <li>{@link #RESULT_CANCEL}<li/> * @param file 文件绝对路径,客户端保存文件的绝对路径 * @param md5 文件md5校验,{@link #RESULT_FAILED}可能为空 * @param options 自定义参数,由云端游戏发送到客户端 * */ void onSendFileResult(int result, String file, String md5, Map<String, String> options); /** * 客户端发起,客户端发送大文件至云端游戏结果回调 * * @param result 结果- code * <li>{@link #RESULT_SUCCESS}<li/> * <li>{@link #RESULT_FAILED}<li/> * <li>{@link #RESULT_CANCEL}<li/> * @param file 文件绝对路径,云端游戏保存文件的绝对路径 * @param md5 文件md5校验,{@link #RESULT_FAILED}可能为空 * @param options 自定义参数,由客户端发送到云端游戏 */ void onReceiveFileResult(int result, String file, String md5, Map<String, String> options); }
参考示例:
VeMessageChannelClient.getInstance().sendFile(filePath)
VeMessageChannelClient.getInstance().cancelSendFile(filePath)
VeMessageChannelClient.getInstance().setFileTransportResultListener(new IFileTransportResultListener() { @Override public void onSendFileResult(int result, String file, String md5, Map<String, String> options) { // 由云端游戏发起,大文件发送,结果回调 } @Override public void onReceiveFileResult(int result, String file, String md5, Map<String, String> options) { // 由客户端发起,发送大文件至云端游戏结果回调 } });
描述: 判断 SDK 是否在火山云端游戏环境运行。方法如下:
isCloudRuntime()
参考示例:
VeMessageChannelClient.getInstance().isCloudRuntime()
返回值:
字段 | 类型 | 描述 |
---|---|---|
mid | String | 消息 ID |
text | String | 消息体,整包大小为 60KB |
timeMillis | Long | 时间戳,精确到毫秒 |
字段 | 类型 | 描述 |
---|---|---|
mid | String | 消息 ID |
text | byte[] | 二进制消息体,整包大小为 60KB |
timeMillis | Long | 时间戳,精确到毫秒 |
消息通道连接状态说明如下:
状态码 | 状态说明 | 描述 |
---|---|---|
1 | CONNECTION_STATE_CONNECTED | 已连接,初始化完成、与客户端之间通道连接成功时触发 |
2 | CONNECTION_STATE_DISCONNECTED | 已断连,与客户端之间通道连接断开时触发 |
3 | CONNECTION_STATE_STOP | 通道停止工作 |
错误码 | 错误信息 | 描述 |
---|---|---|
1 | ERROR_CODE_CONNECT_FAILED | 与服务连接失败 |
2 | ERROR_CODE_DISCONNECT | 与服务断连 |
3 | ERROR_CODE_SEND_FAILED |
|
4 | ERROR_CODE_NOT_CLOUD_RUNTIME | SDK 未在云端环境运行 |
5 | ERROR_CODE_CONNECT_VERIFY_FAILED | 鉴权失败 |
6 | ERROR_CODE_STREAM_INTERRUPTED | 连接异常 |
7 | ERROR_CODE_MESSAGE_FORMAT | 消息格式错误 |