Windows SDK C++版

本文介绍如何使用无影云手机Windows SDK C++版。

1. 快速开始

1.1 获取SDKDEMO

获取方式

集成环境要求

Windows X64 release

引入SDK

Visual Studio 2019示例:

打开项目属性页->配置属性->VC++目录,在包含目录添加asp-client-sdkinclude目录

打开项目属性页->配置属性->VC++目录,在库目录添加asp-client-sdklib目录

打开项目属性页->配置属性->链接器->常规,在附加库目录添加asp-client-sdklib目录

打开项目属性页->配置属性->链接器->输入,在附加依赖项添加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 对接流程

image

1.3 最佳实践

方案详见无影云手机快速集成最佳实践。 云手机集成的总体方案如下图所示

image

有多种登录方式,获取集成SDK所需要的连接云手机Ticket凭证,流程图为:

image

具体代码可以参考生命周期接口的参考代码。

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

参见5.5 AspAction

button

uint32_t

参见5.6 AspMouseButtonMask

buttonState

uint32_t

参见5.7 AspMouseButton

代码示例:

//鼠标左键按下
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

参见5.6 AspMouseButtonMask

代码示例:

//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 剪贴板

本地到云

image.svg

云到本地

image.svg

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. 错误代码

错误码

错误消息(%s表示云手机或云应用)

定义模块

原因

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后,端侧连接的云手机会断开,重启完成后,端侧再连接云手机。

缩略图和主控切换

缩略图切换主控,需要先关闭(缩略图),然后等待关闭完成再切换到(主控)。

image.svg

主控切换缩略图,需要先关闭(主控),然后等待关闭完成再重新打开(缩略图)。

sequenceDiagram
      participant App
      participant Sdk
      App->>Sdk: close(true)
      Sdk-->>App: onConnectEvent EVENT_DISCONNECT_SUCCESS
      App->>Sdk: reopen(Ticket)