本文介绍如何使用无影云手机的Windows SDK C++版。
1. 快速开始
1.1 获取SDK和DEMO
获取方式
下载 Windows_SDK
下载 Windows_Demo源码
下载 Windows_Demo_Release可执行文件
集成环境要求
Windows X64 release
引入SDK
Visual Studio 2019示例:
打开项目属性页->配置属性->VC++目录,在包含目录添加asp-client-sdk的include目录
打开项目属性页->配置属性->VC++目录,在库目录添加asp-client-sdk的lib目录
打开项目属性页->配置属性->链接器->常规,在附加库目录添加asp-client-sdk的lib目录
打开项目属性页->配置属性->链接器->输入,在附加依赖项添加asp-client-sdk.lib、asp-engine.lib、glog.lib
qt creator示例:
项目pro文件添加
INCLUDEPATH+=$$PWD/asp-client-sdk/include \
LIBS+=$$PWD/asp-client-sdk/lib/asp-client-sdk.lib \
$$PWD/asp-client-sdk/lib/asp-engine.lib \
$$PWD/asp-client-sdk/lib/glog.lib \
快速使用Demo
下载Windows_Demo_Release,解压缩得到 server 和 client 两个目录,分别是服务端和客户端的DEMO。
启动服务端
修改配置
{
"httpPort": "8328",
"accessKeyId": "AK",
"accessKeySecret": "SK",
"androidRegionId": "cn-hangzhou"
}
修改其中的 AK 和 SK 即可,androidRegionId填写为实例的RegionId
运行其中的 server/run_server.bat , 会提示
2024-11-01T13:48:27.002Z Server is running on http://127.0.0.1:8328/listAic
服务端启动完成
运行客户端
{
"CLOUD_SCREENSIZE_HEIGHT": 100,
"CLOUD_SCREENSIZE_WIDTH": 100,
"DEBUG_MODE": 2,
"DISPLAY_COL": 11,
"DISPLAY_GROUP": 20,
"GROUPIDS": [
"ag-1jknz4zyznleim503"
],
"GROUP_SCREENSIZE_HEIGHT": 100,
"GROUP_SCREENSIZE_WIDTH": 100,
"LOCAL_SCREENSIZE_HEIGHT": 720,
"LOCAL_SCREENSIZE_WIDTH": 480,
"DISPLAY_SCALE": 1,
"GROUP_SCALE": 8,
"MAX_PHONE_NUM": 0,
"PROXY_CONN_TYPE": 0,
"QUIC_OPTION": false,
"PHONE_URL": "http://127.0.0.1",
"PORT": 8328,
"AUDIO_ENABLE": false,
"USE_DUMP": false,
"USE_OPENGL": true
}
GROUPIDS 修改为需要控制的云手机实例组 ID ag-开头, 可以支持多个 GROUPID, 修改为您创建的 ag 开头的云手机实例组 ID,保存。
配置参数说明:
CLOUD_SCREENSIZE_HEIGHT: 初始化云端分辨率高
CLOUD_SCREENSIZE_WIDTH: 初始化云端分辨率宽
DEBUG_MODE: 日志级别 0-无日志 1-debug 2-info
DISPLAY_COL: 10 展示最大列
GROUPIDS: 分组,支持列表
GROUP_SCREENSIZE_HEIGHT: 初始化本地缩略图窗口高
GROUP_SCREENSIZE_WIDTH: 初始化本地缩略图窗口宽
LOCAL_SCREENSIZE_HEIGHT: 初始化本地主控窗口高
LOCAL_SCREENSIZE_WIDTH: 初始化本地主控窗口宽
DISPLAY_SCALE: 主控缩放比例
GROUP_SCALE: 缩略图缩放比例
MAX_PHONE_NUM: 最多连接数量
PROXY_CONN_TYPE: 连接类型,固定
QUIC_OPTION: 是否使用quick 固定
PHONE_URL: 服务端地址,
PORT: 服务端端口
AUDIO_ENABLE: 是否启用音频
EndUserId: 协同流用户名
IS_COO: 是否协同流
SALE_MODE: 是否CPS
SHOW_INSTENCE_NAME: 显示名称还是ID
USE_OPENGL: 是否启用opengl渲染
运行 client/WuyingDemo.exe
1.2 对接流程
1.3 最佳实践
方案详见无影云手机快速集成最佳实践。 云手机集成的总体方案如下图所示
有多种登录方式,获取集成SDK所需要的连接云手机Ticket凭证,流程图为:
具体代码可以参考生命周期接口的参考代码。
2. 生命周期接口
2.1 创建缩略图连接
函数原型: static AspClient* create(AspTicket& ticket, wuying::asp::shared_ptr<IAspClientCallback> callback);
参数说明:
参数名称 | 参数类型 | 描述 |
ticket | AspTicket | AspTicket包含了是否为缩列图、实例信息和连接凭证,参见4.1 AspTicket。 |
callback | IAspClientCallback | 连接回调,参见2.5.1 连接回调代理IAspClientCallback。 |
功能描述:该接口建立与云手机缩略图连接。
代码示例:
AspTicket ticket;
// 设置ticket
ticket.ticket = "";
// 设置AppInstanceId
ticket.id = "";//AppInstanceId;
// 设置user
ticket.user = "";//云手机名称
//uuid与后端uuid相同
ticket.uuid = "wyClient";
//固定Windows
ticket.systemType = "Windows";
//固定0
ticket.partner = 0;
//是否缩略图 固定为true
ticket.isThumbnailEnable = true;
//添加连接回调,具体见后文
shared_ptr<AspClientCbImpl> iClient(new AspClientCbImpl(cert.Id));
AspClient *client=AspClient::create(ticket, iClient);
//剪贴板回调,具体见后文
shared_ptr<AspClipboardlmpl> clipboardCallback(new AspClipboardlmpl());
client->setClipboardCallback(clipboardCallback);
//添加Shell命令回调,具体见后文
shared_ptr<AspShellCmdlmpl> shellCmdCallBack(new AspShellCmdlmpl());
client->setShellCmdCallback(shellCmdCallBack);
//设置缩略图窗口大小 with:宽 int height:高 int 1:fps int
client->setThumbnailDisplay(with, height, 1);
//设置连接类型 固定为socket和false
client->setProxyConnType(ASP_CONN_SOCKET);
client->setQuicOption(false);
//设置窗口回调
shared_ptr<IAspDisplayCallback> iDisplay(nullptr);
auto display = client->addDisplay(iDisplay);
//连接手机
client->open();
2.2 创建主控连接
函数原型: static AspClient* create(AspTicket& ticket, wuying::asp::shared_ptr<IAspClientCallback> callback);
参数说明:
参数名称 | 参数类型 | 描述 |
ticket | AspTicket | AspTicket包含了实例信息和连接凭证,参见4.1 AspTicket。 |
callback | IAspClientCallback | 连接回调,参见2.5.1 连接回调代理IAspClientCallback。 |
功能描述:该接口建立与云手机主控连接
代码示例:
AspTicket ticket;
// 设置ticket
ticket.ticket = "";
// 设置AppInstanceId
ticket.id = "";//AppInstanceId;
// 设置user
ticket.user = "";//云手机名称
//uuid与后端uuid相同
ticket.uuid = "wyClient";
//固定Windows
ticket.systemType = "Windows";
//固定0
ticket.partner = 0;
//是否缩略图 固定为true
ticket.isThumbnailEnable = true;
//添加连接回调,具体见后文
shared_ptr<AspClientCbImpl> iClient(new AspClientCbImpl(cert.Id));
AspClient *client=AspClient::create(ticket, iClient);
//剪贴板回调,具体见后文
shared_ptr<AspClipboardlmpl> clipboardCallback(new AspClipboardlmpl());
client->setClipboardCallback(clipboardCallback);
//添加Shell命令回调,具体见后文
shared_ptr<AspShellCmdlmpl> shellCmdCallBack(new AspShellCmdlmpl());
client->setShellCmdCallback(shellCmdCallBack);
//设置缩略图窗口大小 with:宽 int height:高 int 1:fps int
client->setThumbnailDisplay(with, height, 1);
//设置连接类型 固定为socket和false
client->setProxyConnType(ASP_CONN_SOCKET);
client->setQuicOption(false);
//设置窗口回调
shared_ptr<IAspDisplayCallback> iDisplay(nullptr);
auto display = client->addDisplay(iDisplay);
//连接云手机
client->open();
2.3 reopen
函数原型:void reopen(std::string& ticket)
功能描述:重新打开连接,或断联后重连,仅close(false)
有效。
参数说明:
参数名称 | 参数类型 | 描述 |
ticket | std::string | ticket为连接凭证,有效期一般10分钟。 |
代码示例:
client->reopen(ticket);
2.4 close
函数原型:void close(bool destroyClient = false)
功能描述:关闭连接
参数说明:
参数名称 | 参数类型 | 描述 |
destroyClient | bool | 是否清理资源,默认false |
代码示例:
client->close(false)
2.5 回调说明
2.5.1 连接回调代理IAspClientCallback
代理接口说明:
接口 | 描述 |
void onThumbnailUpdate(void* buffer, uint32_t width, uint32_t height, AspImageFormat format) | 连接云手机成功缩略图的回调,format参见5.2 AspImageFormat |
void onConnectEvent(ConnectEvent& event) | 连接云手机状态事件的回调,event参见4.2 ConnectEvent |
代码示例:
class AspClientCbImpl : public IAspClientCallback
{
public:
AspClientCbImpl() {}
//缩略图回调
void onThumbnailUpdate(void* buffer, uint32_t width, uint32_t height, AspImageFormat format) override {
}
//连接事件
void onConnectEvent(ConnectEvent& event) override {
switch(event.type) {
case ConnectEventType::EVENT_CONNECT_SUCCESS:
break;
case ConnectEventType::EVENT_CONNECT_FAILED:
break;
case ConnectEventType::EVENT_DISCONNECT_SUCCESS:
break;
case ConnectEventType::EVENT_RECONNECT_START:
break;
case ConnectEventType::EVENT_RECONNECT_FAILED:
break;
default:
break;
}
}
};
2.5.2 主控流回调代理IAspDisplayCallback
代理接口说明:
接口 | 描述 |
void onImageFrameReady(AspImageFrame& frame) | 连接云手机成功后主控流的回调,frame参见4.3 AspImageFrame |
代码示例:
class AspDisplayCbImpl : public IAspDisplayCallback
{
public:
void onImageFrameReady(AspImageFrame& frame) override {
//主控的图像byte数组指针,长度为长*宽*4
uint8_t* ptr = static_cast<uint8_t*>(frame.buffer);
//图像的宽
int width = frame.width;
//图像的高
int height = frame.height;
//必须手动释放
frame.releaseBuffer();
}
};
2.5.3 音频回调代理AspAudio
代理接口说明:
接口 | 描述 |
void onAudioFrameRender(AspAudioFrame &frame) | 无需实现, frame参见4.4 AspAudioFrame,目前音频渲染包含在SDK中。 |
void onAudioVolumeUpdate(uint32_t volume) | 无需实现,目前音频渲染包含在SDK中。 |
void onAudioMuteUpdate(bool isMute) | 无需实现,目前音频渲染包含在SDK中。 |
void onAudioPlaybackUpdate(AspAudioPlayback &playback) | 无需实现,playback参见4.5 AspAudioPlayback,目前音频渲染包含在SDK中。 |
void onAudioPlaybackStart() | 无需实现,目前音频渲染包含在SDK中。 |
void onAudioPlaybackStop() | 无需实现,目前音频渲染包含在SDK中。 |
代码示例:
class AspAudioImpl : public AspAudio
{
public:
void onAudioFrameRender(AspAudioFrame &frame) override{
}
void onAudioVolumeUpdate(uint32_t volume) override{
}
void onAudioMuteUpdate(bool isMute) override{
}
void onAudioPlaybackUpdate(AspAudioPlayback &playback) override{
}
void onAudioPlaybackStart() override{
}
void onAudioPlaybackStop() override{
}
};
3. 业务接口
3.1 日志接口
3.1.1 初始化
功能描述:该接口可以打印SDK内部日志,用于定位问题。
代码示例:
//初始化日志,AspLogSinkImpl为日志回调
auto logSinkImpl = std::make_shared<AspLogSinkImpl>();
AspLogSink::setLogSink(logSinkImpl.get());
3.1.2 回调代理AspLogSink
代理接口说明:
接口 | 描述 |
void debug(const std::string& tag, const std::string& msg) | SDK debug日志回调 |
void info(const std::string& tag, const std::string& msg) | SDK info日志回调 |
void warning(const std::string& tag, const std::string& msg) | SDK warning日志回调 |
void fatal(const std::string& tag, const std::string& msg) | SDK fatal日志回调 |
void error(const std::string& tag, const std::string& msg) | SDK error日志回调 |
代码示例:
#include "AspLogSink.h"
using namespace wuying::asp;
class AspLogSinkImpl : public AspLogSink
{
public:
AspLogSinkImpl() {
}
void debug(const std::string& tag, const std::string& msg) override {
//打印debug日志
}
void info(const std::string& tag, const std::string& msg) override {
//打印info日志
}
void warning(const std::string& tag, const std::string& msg) override {
//打印warning日志
}
void fatal(const std::string& tag, const std::string& msg) override {
//打印fatal日志
}
void error(const std::string& tag, const std::string& msg) override {
//打印error日志
}
};
3.2 缩略图业务接口
3.2.1 suspendThumbnailDisplay
函数原型:void suspendThumbnailDisplay()
功能描述:挂起缩略图的图像,不推流
代码示例:
client->suspendThumbnailDisplay();
3.2.2 resumeThumbnailDisplay
函数原型:void resumeThumbnailDisplay()
功能描述:恢复缩略图的推流,可以强制推一帧
代码示例:
client->resumeThumbnailDisplay();
3.3 主控其他功能
3.3.1 setOutputImageFormat
函数原型:void setOutputImageFormat(AspImageFormat format)
功能描述:设置主控回调帧格式
参数说明:
参数名称 | 参数类型 | 描述 |
format | AspImageFormat | 主控回调帧格式,具体参见5.2 AspImageFormat |
代码示例:
client->setOutputImageFormat(AspImageFormat::BGRA);
3.3.2 requestGraphicsKeyFrame
函数原型:void requestGraphicsKeyFrame(AspDisplay* display) = 0;
功能描述:推一帧主控的关键帧,参数AspDisplay
参数说明:
参数名称 | 参数类型 | 描述 |
display | AspDisplay* | 显示类指针 |
代码示例:
client->requestGraphicsKeyFrame(display);
3.3.3 setGraphicsQuality
函数原型:void setGraphicsQuality(AspImageQuality quality) = 0;
功能描述:设置画质,画质跟分辨率有关系,一般设置为AUTO,详细参数参见结构体
参数说明:
参数名称 | 参数类型 | 描述 |
quality | AspImageQuality | 图像质量参见5.4 AspImageQuality |
client->setGraphicsQuality(ASP_IMAGE_QUALITY_AUTO)
3.3.4 setGraphicsFps
函数原型:void setGraphicsFps(int fps) = 0;
功能描述:设置fps
参数说明:
参数名称 | 参数类型 | 描述 |
fps | int | 帧率 |
代码示例:
client->setGraphicsFps(30)
3.3.5 setGraphicsBitrate
函数原型:void setGraphicsBitrate(int32_t bps) = 0;
功能描述:设置码率,码率影响图片的大小
参数说明:
参数名称 | 参数类型 | 描述 |
bps | int32_t | 码率 |
以下码率仅供参考:
画质 | 码率 |
低画质 | 1*1024 |
中画质 | 5*1024 |
高画质 | 10*1024 |
不失真 | 50*1024 |
代码示例:
client->setGraphicsBitrate(1*1024)
3.4 鼠标
3.4.1 sendMouseClick
函数原型:void sendMouseClick(AspAction action, uint32_t button, uint32_t buttonState) = 0;
功能描述:鼠标点击
参数说明:
参数名称 | 参数类型 | 描述 |
action | AspAction | |
button | uint32_t | |
buttonState | uint32_t |
代码示例:
//鼠标左键按下
display->sendMouseClick(AspAction::ACTION_DOWN, ASP_MOUSE_BUTTON_MASK_L, ASP_MOUSE_BUTTON_LEFT);
//鼠标左键弹起
display->sendMouseClick(AspAction::ACTION_UP, ASP_MOUSE_BUTTON_MASK_L, ASP_MOUSE_BUTTON_LEFT);
3.4.2 sendMouseMove
函数原型:virtual void sendMouseMove(uint32_t x, uint32_t y, uint32_t buttonState) = 0;
功能描述:鼠标移动
参数说明:
参数名称 | 参数类型 | 描述 |
x | uint32_t | 云手机横坐标 |
y | uint32_t | 云手机纵坐标 |
buttonState | uint32_t |
代码示例:
//x y 为云机的x y坐标
sendMouseMove(x, y, ASP_MOUSE_BUTTON_MASK_L)
3.5 键盘
3.5.1 sendKeyEvent
函数原型:virtual void sendKeyEvent(AspAction action, int scancode) = 0;
功能描述:键盘事件
参数说明:
参数名称 | 参数类型 | 描述 |
action | AspAction | 操作类型参见5.5 AspAction |
scancode | int | 按键扫描码 |
代码示例:
//键盘按下
display->sendKeyEvent(AspAction::ACTION_DOWN,scanCode);
//键盘弹起
display->sendKeyEvent(AspAction::ACTION_UP,scanCode);
3.6 剪贴板
本地到云
云到本地
3.6.1 setClipBoardTypes
函数原型:virtual void setClipBoardTypes(std::vector<AspClipboardType> types) = 0;
功能描述:发送剪贴板类型,一般在Ctrl
+V
调用或写入剪贴板时调用,目前仅支持文本。
参数说明:
参数名称 | 参数类型 | 描述 |
types | std::vector<AspClipboardType> | 剪贴板类型数组,参见5.8 AspClipboardType |
代码示例:
std::vector<AspClipboardType> types;
types.push_back(AspClipboardType::CLIPBOARD_UTF8_TEXT);
client->setClipBoardTypes(types);
3.6.2 notifyClipboardReadComplete
函数原型:virtual void notifyClipboardReadComplete(AspClipboardType type, uint8_t* buf, size_t len) = 0;
功能描述:将内容传到云机在onClipboardRead(uint8_t selection, AspClipboardType type)触发时调用
参数说明:
参数名称 | 参数类型 | 描述 |
type | AspClipboardType | 剪贴板类型目前只支持文本 |
buf | uint8_t* | 剪贴板内容的字节数组指针 |
len | size_t | buf大小 |
代码示例:
void onClipboardRead(uint8_t selection, AspClipboardType type) override {
//本地到云机,通过client->setClipBoardTypes(types)触发
//触发onClipboardRead,将剪贴板内容写入notifyClipboardReadComplete
client->notifyClipboardReadComplete(type, reinterpret_cast<uint8_t *>(utf8Data.data()), utf8Data.size());
}
3.6.3 回调代理IClipboardCallback
代理接口说明:
接口 | 描述 |
void onClipboardRead(uint8_t selection, AspClipboardType type) | 本地到云机,通过setClipBoardTypes(types)触发,触发时调用notifyClipboardReadComplete将剪贴板内容写入,type参见5.8 AspClipboardType |
void onClipboardWrite(std::vector<AspClipboardData> dataV) | 云机到本地,触发时将内容写入剪贴板,data参见4.6 AspClipboardData |
代码示例:
class AspClipboardlmpl :public IClipboardCallback
{
public:
AspClipboardlmpl() {};
void onClipboardRead(uint8_t selection, AspClipboardType type) override {
//本地到云机,通过client->setClipBoardTypes(types)触发
//触发onClipboardRead,将剪贴板内容写入notifyClipboardReadComplete
//client->notifyClipboardReadComplete(type, reinterpret_cast<uint8_t *>(utf8Data.data()), utf8Data.size());
}
void onClipboardWrite(std::vector<AspClipboardData> dataV) override {
//云机到本地剪贴板,将dataV数据写入剪贴板
}
};
3.7 Shell命令通道
3.7.1 sendStringDataToShell
函数原型:virtual bool sendStringDataToShell(const std::string& val) = 0;
功能描述:发送Shell命令
参数说明:
参数名称 | 参数类型 | 描述 |
val | std::string | 发送的ADB Shell命令格式:{"id":"","cmd":""} |
代码示例:
client->sendStringDataToShell(jsonString)
常用ADB命令:
功能 | 命令 |
返回键 | input keyevent KEYCODE_BACK |
Home键 | input keyevent KEYCODE_HOME |
切换键 | input keyevent KEYCODE_APP_SWITCH |
静音 | input keyevent 164 |
音量增大 | input keyevent KEYCODE_VOLUME_UP |
音量减小 | input keyevent KEYCODE_VOLUME_DOWN |
隐藏导航栏 | setprop persist.wy.hasnavibar false; killall com.android.systemui |
显示导航栏 | setprop persist.wy.hasnavibar true; killall com.android.systemui |
截图 | screencap -p /sdcard/Download/abc.png |
3.7.2 回调代理IShellCmdCallback
代理接口说明:
接口 | 描述 |
void onReceiveStringData(const std::string& val) | 接收字符流Shell命令回执 |
void onReceiveRawData(const std::vector<uint8_t> val) | 接收字节流Shell命令回执 |
代码示例:
class AspShellCmdlmpl :public IShellCmdCallback
{
public:
AspShellCmdlmpl() {};
void onReceiveStringData(const std::string& val) override {
//发送字符的回调
}
void onReceiveRawData(const std::vector<uint8_t> val) override {
//发送字节的回调
}
};
4. 参数详细说明
4.1 AspTicket
struct AspTicket {
std::string ticket; //获取云手机的ticket字符串
std::string id; //桌面id
std::string user; //用户名
std::string uuid; //本机uuid,请求ticket的时候使用的uuid
std::string systemType; //操作系统类型
uint8_t partner; //合作方
bool isThumbnailEnable = false; //是否是缩略图模式
};
4.2 ConnectEvent
struct ConnectEvent {
ConnectEventType type; //连接成功、连接失败等事件类型
int reason; //事件触发的原因
};
4.3 AspImageFrame
struct AspImageFrame {
uint32_t frameId;
void* buffer;
uint32_t width;
uint32_t height;
AspImageFormat format;
ReleaseBuffer releaseBuffer;
};
4.4 AspAudioFrame
struct AspAudioFrame {
int sample; //采样率
int channels; //通道
int size; //数据大小
uint8_t *data; //数据地址
ReleaseBuffer releaseBuffer; //data释放函数,在data使用完之后必须调用
};
4.5 AspAudioPlayback
struct AspAudioPlayback {
AspAudioReadType readType; //音频数据获取方式,包括PUSH和PULL两种方式
AspAudioMode mode; //PCM or OPUS
uint32_t channels; //通道数
uint32_t frequency; //采样率
AspAudioFormat format; //RAW or OPUS
AudioReader audioReader; //PULL读取方式时,数据读取的函数,请参照demo的实现
};
4.6 AspClipboardData
struct AspClipboardData {
AspClipboardType type;
uint8_t* data;
uint32_t size;
};
5. 枚举类型
5.1 AspConnType
enum AspConnType {
ASP_CONN_SOCKET = 0,
ASP_CONN_SOCKPAIR = 1,
ASP_CONN_PIPE = 2,
ASP_CONN_SOCKET_UNIX = 3,
ASP_CONN_END = ASP_CONN_PIPE,
};
5.2 AspImageFormat
enum class AspImageFormat {
YUV420P,
YUV422P,
YUV444P,
RGB24,
RGBA,
BGRA,
ARGB,
ABGR,
NV12
};
5.3 ConnectEventType
enum ConnectEventType {
EVENT_CONNECT_SUCCESS,
EVENT_CONNECT_FAILED,
EVENT_DISCONNECT_SUCCESS,
EVENT_RECONNECT_START,
EVENT_RECONNECT_FAILED
};
5.4 AspImageQuality
enum AspImageQuality {
ASP_IMAGE_QUALITY_LOSSLESS = 0,
ASP_IMAGE_QUALITY_HIGH = 1,
ASP_IMAGE_QUALITY_MEDIUM = 2,
ASP_IMAGE_QUALITY_LOW = 3,
ASP_IMAGE_QUALITY_AUTO = 4,
};
5.5 AspAction
enum AspAction {
ACTION_UP,
ACTION_DOWN
};
5.6 AspMouseButtonMask
enum AspMouseButtonMask {
ASP_MOUSE_BUTTON_MASK_L = (1 << 0),
ASP_MOUSE_BUTTON_MASK_M = (1 << 1),
ASP_MOUSE_BUTTON_MASK_R = (1 << 2),
ASP_MOUSE_BUTTON_MASK_F = (1 << 3),
ASP_MOUSE_BUTTON_MASK_B = (1 << 4),
ASP_MOUSE_BUTTON_MASK = 0x1f
};
5.7 AspMouseButton
enum AspMouseButton {
ASP_MOUSE_BUTTON_INVALID,
ASP_MOUSE_BUTTON_LEFT,
ASP_MOUSE_BUTTON_MIDDLE,
ASP_MOUSE_BUTTON_RIGHT,
ASP_MOUSE_BUTTON_UP,
ASP_MOUSE_BUTTON_DOWN,
ASP_MOUSE_BUTTON_SIDE_FORWARD,
ASP_MOUSE_BUTTON_SIDE_BACK,
ASP_MOUSE_BUTTON_ENUM_END
};
5.8 AspClipboardType
enum AspClipboardType {
CLIPBOARD_NONE = 0,
CLIPBOARD_UTF8_TEXT,
CLIPBOARD_IMAGE_PNG, /* All clients with image support should support this one */
CLIPBOARD_IMAGE_BMP, /* optional */
CLIPBOARD_IMAGE_TIFF, /* optional */
CLIPBOARD_IMAGE_JPG, /* optional */
CLIPBOARD_FILE, /* optional, single file */
CLIPBOARD_DIRECTORY, /* optional, support directory recrusive */
CLIPBOARD_HTML,
CLIPBOARD_RTF,
CLIPBOARD_XML_SPREAD_SHEET,
};
6. 错误代码
错误码 | 错误消息( | 定义模块 | 原因 |
2~26主要是网络相关问题 | |||
2 | 连接%s失败 | ASP SDK | 无效MAGIC |
3 | 连接%s失败 | ASP SDK | 数据有误 |
4 | 客户端与服务端版本不匹配 | ASP SDK | 版本不匹配 |
5 | 连接需要 TLS | ASP SDK | 需要TLS |
6 | 连接不需要 TLS | ASP SDK | 不需要TLS而实际使用了TLS |
7 | 您没有权限连接当前%s | ASP SDK | 权限问题 |
8 | ASP SDK | 迁移过程中client ID无效 | |
9 | 连接%s失败 | ASP SDK | channel不存在 |
20 | 连接ASP服务器失败。 | ASP SDK | channel 连接错误 |
21 | TLS认证出错了 | ASP SDK | TLS 认证错误 |
22 | 连接%s失败 | ASP SDK | channel link 错误 |
23 | 连接%s失败 | ASP SDK | 连接认证错误 |
24 | 连接%s失败 | ASP SDK | 连接IO错误 |
25 | 连接%s失败 | ASP SDK | Ticket校验失败。用户连接被断开后,若使用同一个Ticket再次请求建连,也将触发此错误。 |
26 | ASP SDK | xquic 握手失败 | |
连接中断开或遇到某些错误的情况 | |||
2000 | 获取%s数据超时,与服务端断开连接 | ASP SDK | 正常断开 |
2001 | %s已与服务端断开连接。可能是因为%s进程已被强制终止。 | ASP SDK | 一般是端上应用被终止进程了,如Android应用用户通过按下Home键终止 |
2002 | 已有用户从其他终端连接当前%s。请稍后重试。 | ASP SDK | 其他人抢占了端 |
2003 | %s正在关机或重启,一般由管理员操作,请稍后重试。 | ASP SDK | 云手机被关机或重启,一般是管理员操作 |
2004 | 当前用户连接被断开。 | ASP SDK | 客户端发起断流,或服务端发起踢人或断流 |
2005 | %s已超时断开连接,因为已达到管理员设置的使用时长限制。 | ASP SDK | 管理员设置使用时长被关 |
2010 | 连接%s失败 | ASP SDK | Vdagent连接失败 |
2011 | 连接参数传递错误。 | ASP SDK | 连接server参数传递错误 |
2027 | 拉流模式已切换。 | ASP SDK | 拉流模式由抢占模式切换为协同模式,或由协同模式切换为抢占模式 |
2100 | 剪切板权限,禁止从%s到本地 | ASP SDK | 剪贴板权限,禁止从VM到本地 |
2101 | 剪切板权限,禁止从本地到%s | ASP SDK | 剪贴板权限,禁止从本地到 VM |
2200 | %s正在尝试重连... | ASP SDK | 因为网络问题断开了,ASP SDK正在重连 |
2201 | 您的设备出现网络异常,导致%s已断开连接。 | ASP SDK | 因为网络问题断开了,ASP SDK因为镜像原因不支持重连,应用侧开始重连 |
2202 | %s重连超时,请检查设备网络后重试。 | ASP SDK | ASP SDK重连超时 |
端侧逻辑错误 | |||
5100 | %s连接ASP Server超时,请稍后重试。 | 应用侧 | 端侧在一段时间内未接收到connected事件 |
5102 | 获取%s数据超时,请稍后重试。 | 应用侧 | 端侧在一段时间内接收到了connected但未接收到display事件 |
5004 | 客户端出现错误,请重新打开 | 应用侧 | 传入端侧启动参数有误,一般出现在开发阶段 |
5200 | 客户端重连超时,请稍后重试。 | 应用侧 |
7. 常见问题
怎么重启云手机
调用管控重启API 重启实例进行重启,调用重启API后,端侧连接的云手机会断开,重启完成后,端侧再连接云手机。
缩略图和主控切换
缩略图切换主控,需要先关闭(缩略图),然后等待关闭完成再切换到(主控)。
主控切换缩略图,需要先关闭(主控),然后等待关闭完成再重新打开(缩略图)。
sequenceDiagram
participant App
participant Sdk
App->>Sdk: close(true)
Sdk-->>App: onConnectEvent EVENT_DISCONNECT_SUCCESS
App->>Sdk: reopen(Ticket)