Todos os produtos
Search
Central de documentação

Cloud Phone:Edição C++ do Windows SDK

Última atualização: Jul 03, 2026

Este tópico descreve como usar a edição C++ do Windows SDK para o Cloud Phone.

1. Primeiros passos

1,1 Obter o SDK e a demonstração

Baixe o SDK e a demonstração

Requisitos do ambiente de integração

Windows x64 release

Importar o SDK

Exemplo no Visual Studio 2019:

Abra Project Properties > Configuration Properties > VC++ Directories. Adicione o diretório include do asp-client-sdk em Include Directories.

Abra Project Properties > Configuration Properties > VC++ Directories. Adicione o diretório lib do asp-client-sdk em Library Directories.

Abra Project Properties > Configuration Properties > Linker > General. Adicione o diretório lib do asp-client-sdk em Additional Library Directories.

Abra Project Properties > Configuration Properties > Linker > Input. Adicione asp-client-sdk.lib, asp-engine.lib e glog.lib em Additional Dependencies.

Exemplo no Qt Creator:

Adicione as linhas abaixo ao arquivo .pro do seu projeto:

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 \

Executar rapidamente a demonstração

Baixe o Windows_Demo_Release e descompacte-o para obter dois diretórios: server e client. Esses diretórios contêm, respectivamente, as demonstrações do lado do servidor e do lado do cliente.

Iniciar o servidor

Modifique o arquivo de configuração:

{
    "httpPort": "8328",
    "accessKeyId": "AK",
    "accessKeySecret": "SK",
    "androidRegionId": "cn-hangzhou"
}

Substitua AK e SK pelos seus valores reais de AccessKey ID e AccessKey Secret. Defina androidRegionId com o id da região da sua instância.

Execute server/run_server.bat. A seguinte mensagem será exibida:

2024-11-01T13:48:27.002Z Server is running on http://127.0.0.1:8328/listAic

O servidor foi iniciado com sucesso.

Executar o cliente

{
  "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
}

Substitua GROUPIDS pelo id do grupo de instâncias do Cloud Phone que você deseja controlar. O id deve começar com ag-. É possível especificar vários ids de grupo. Salve o arquivo após atualizá-lo com o id do grupo de instâncias do Cloud Phone prefixado com ag-.

Descrição dos parâmetros de configuração:

CLOUD_SCREENSIZE_HEIGHT: Initial cloud screen height
CLOUD_SCREENSIZE_WIDTH: Initial cloud screen width
DEBUG_MODE: Log level (0 = no logs, 1 = debug, 2 = info)
DISPLAY_COL: Maximum number of columns displayed (10)
GROUPIDS: Instance groups (supports a list)
GROUP_SCREENSIZE_HEIGHT: Initial local thumbnail window height
GROUP_SCREENSIZE_WIDTH: Initial local thumbnail window width
LOCAL_SCREENSIZE_HEIGHT: Initial local main control window height
LOCAL_SCREENSIZE_WIDTH: Initial local main control window width
DISPLAY_SCALE: Main control scaling ratio
GROUP_SCALE: Thumbnail scaling ratio
MAX_PHONE_NUM: Maximum number of connections
PROXY_CONN_TYPE: Connection type (fixed value)
QUIC_OPTION: Whether to use QUIC (fixed value)
PHONE_URL: Server address
PORT: Server port
AUDIO_ENABLE: Whether to enable audio
EndUserId: Collaborative streaming username
IS_COO: Whether collaborative streaming is enabled
SALE_MODE: Whether CPS is enabled
SHOW_INSTENCE_NAME: Whether to display the instance name or ID
USE_OPENGL: Whether to enable OpenGL rendering

Execute client/WuyingDemo.exe.

1,2 Fluxo de integração

image

1,3 Melhores práticas

Para orientações detalhadas sobre integração, consulte Melhores práticas para integrar rapidamente o Cloud Phone. O diagrama a seguir ilustra a arquitetura geral de integração do Cloud Phone:

image

Existem diversos métodos de logon disponíveis para obter o ticket necessário à integração do SDK. O fluxograma abaixo apresenta esse processo:

image

Para detalhes específicos de implementação, consulte o código de exemplo na seção Interfaces de ciclo de vida.

2. Interfaces de ciclo de vida

2,1 Criar uma conexão de miniatura

Protótipo da função: static AspClient* create(AspTicket& ticket, wuying::asp::shared_ptr<IAspClientCallback> callback);

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

ticket

AspTicket

O AspTicket contém informações sobre se é uma miniatura, detalhes da instância e credenciais de conexão. Para mais informações, consulte 4,1 AspTicket.

callback

IAspClientCallback

Callback de conexão. Para mais informações, consulte 2.5.1 Proxy de callback de conexão IAspClientCallback.

Descrição da função: Esta interface estabelece uma conexão de miniatura com um Cloud Phone.

Exemplo de código:

AspTicket ticket;
// Set ticket
ticket.ticket = "";
// Set AppInstanceId
ticket.id = "";//AppInstanceId;
// Set user
ticket.user = "";//Cloud Phone name
// uuid must match the backend uuid
ticket.uuid = "wyClient";
// Fixed for Windows
ticket.systemType = "Windows";
// Fixed to 0
ticket.partner = 0;
// Whether thumbnail mode is enabled. Fixed to true.
ticket.isThumbnailEnable = true;

// Add connection callback. See below for details.
shared_ptr<AspClientCbImpl> iClient(new AspClientCbImpl(cert.Id));
AspClient *client=AspClient::create(ticket, iClient);

// Clipboard callback. See below for details.
shared_ptr<AspClipboardlmpl> clipboardCallback(new AspClipboardlmpl());
client->setClipboardCallback(clipboardCallback);

// Shell command callback. See below for details.
shared_ptr<AspShellCmdlmpl> shellCmdCallBack(new AspShellCmdlmpl());
client->setShellCmdCallback(shellCmdCallBack);

// Set thumbnail display size: width (int), height (int), fps (int)
client->setThumbnailDisplay(with, height, 1);

// Set connection type. Fixed to socket and false.
client->setProxyConnType(ASP_CONN_SOCKET);
client->setQuicOption(false);

// Set display callback
shared_ptr<IAspDisplayCallback> iDisplay(nullptr);
auto display = client->addDisplay(iDisplay);

// Connect to the phone
client->open();

2,2 Criar uma conexão de controle principal

Protótipo da função: static AspClient* create(AspTicket& ticket, wuying::asp::shared_ptr<IAspClientCallback> callback);

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

ticket

AspTicket

O AspTicket contém informações da instância e credenciais de conexão. Para mais informações, consulte 4,1 AspTicket.

callback

IAspClientCallback

Callback de conexão. Para mais informações, consulte 2.5.1 Proxy de callback de conexão IAspClientCallback.

Descrição da função: Esta interface estabelece uma conexão de controle principal com um Cloud Phone.

Exemplo de código:

AspTicket ticket;
// Set the ticket.
ticket.ticket = "";
// Set the AppInstanceId.
ticket.id = "";//AppInstanceId;
// Set the user.
ticket.user = "";// The name of the cloud phone.
// The UUID must be the same as the one on the backend.
ticket.uuid = "wyClient";
// Set to a fixed value: Windows.
ticket.systemType = "Windows";
// Set to a fixed value: 0.
ticket.partner = 0;
// Enable the thumbnail feature. Set to a fixed value: true.
ticket.isThumbnailEnable = true;

// Add a connection callback. For more information, see the subsequent sections.
shared_ptr<AspClientCbImpl> iClient(new AspClientCbImpl(cert.Id));
AspClient *client=AspClient::create(ticket, iClient);

// Clipboard callback. For more information, see the subsequent sections.
shared_ptr<AspClipboardlmpl> clipboardCallback(new AspClipboardlmpl());
client->setClipboardCallback(clipboardCallback);

// Add a Shell command callback. For more information, see the subsequent sections.
shared_ptr<AspShellCmdlmpl> shellCmdCallBack(new AspShellCmdlmpl());
client->setShellCmdCallback(shellCmdCallBack);

// Set the thumbnail window size. Parameters: width (int), height (int), and fps (int).
client->setThumbnailDisplay(with, height, 1);

// Set the connection type. The type is fixed to socket and the QUIC option is set to false.
client->setProxyConnType(ASP_CONN_SOCKET);
client->setQuicOption(false);

// Set the window callback.
shared_ptr<IAspDisplayCallback> iDisplay(nullptr);
auto display = client->addDisplay(iDisplay);

// Connect to the cloud phone.
client->open();

2,3 reopen

Protótipo da função: void reopen(std::string& ticket)

Descrição da função: Reabre uma conexão ou reconecta após uma desconexão. Válido apenas após chamar close(false).

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

ticket

std::string

O ticket é a credencial de conexão. Geralmente, possui validade de 10 minutos.

Exemplo de código:

client->reopen(ticket);

2,4 close

Protótipo da função: void close(bool destroyClient = false)

Descrição da função: Fecha a conexão.

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

destroyClient

bool

Indica se os recursos devem ser limpos. O valor padrão é false.

Exemplo de código:

client->close(false)

2,5 Descrições de callbacks

2.5.1 Proxy de callback de conexão IAspClientCallback

Descrições das interfaces de proxy:

Interface

Descrição

void onThumbnailUpdate(void* buffer, uint32_t width, uint32_t height, AspImageFormat format)

Chamado quando uma miniatura é atualizada com sucesso em uma conexão do Cloud Phone. Para detalhes do formato, consulte 5,2 AspImageFormat.

void onConnectEvent(ConnectEvent& event)

Chamado quando ocorre um evento de conexão. Para detalhes do evento, consulte 4,2 ConnectEvent.

Exemplo de código:

class AspClientCbImpl : public IAspClientCallback
{
public:
    AspClientCbImpl() {}
    // Thumbnail update callback
    void onThumbnailUpdate(void* buffer, uint32_t width, uint32_t height, AspImageFormat format) override {

    }
    // Connection event callback
    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 Proxy de callback de fluxo de controle principal IAspDisplayCallback

Descrições das interfaces de proxy:

Interface

Descrição

void onImageFrameReady(AspImageFrame& frame)

Chamado quando o fluxo de controle principal está pronto após uma conexão bem-sucedida com o Cloud Phone. Para detalhes do frame, consulte 4,3 AspImageFrame.

Exemplo de código:

class AspDisplayCbImpl : public IAspDisplayCallback
{
public:
    void onImageFrameReady(AspImageFrame& frame) override {
        // Pointer to the main control image byte array (length = width × height × 4)
        uint8_t* ptr = static_cast<uint8_t*>(frame.buffer);
        // Image width
        int width = frame.width;
        // Image height
        int height = frame.height;
        // Must manually release
        frame.releaseBuffer();
    }
};

2.5.3 Proxy de callback de áudio AspAudio

Descrições das interfaces de proxy:

Interface

Descrição

void onAudioFrameRender(AspAudioFrame &frame)

Não requer implementação. Para detalhes do frame, consulte 4,4 AspAudioFrame. O SDK gerencia a renderização de áudio internamente.

void onAudioVolumeUpdate(uint32_t volume)

Não requer implementação. O SDK gerencia a renderização de áudio internamente.

void onAudioMuteUpdate(bool isMute)

Não requer implementação. O SDK gerencia a renderização de áudio internamente.

void onAudioPlaybackUpdate(AspAudioPlayback &playback)

Não requer implementação. Para detalhes da reprodução, consulte 4,5 AspAudioPlayback. O SDK gerencia a renderização de áudio internamente.

void onAudioPlaybackStart()

Não requer implementação. O SDK gerencia a renderização de áudio internamente.

void onAudioPlaybackStop()

Não requer implementação. O SDK gerencia a renderização de áudio internamente.

Exemplo de código:

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. Interfaces de negócio

3,1 Interfaces de log

3.1.1 Inicialização

Descrição da função: Esta interface imprime logs internos do SDK para solução de problemas.

Exemplo de código:

// Initialize logging. AspLogSinkImpl is the log callback.
auto logSinkImpl = std::make_shared<AspLogSinkImpl>();
AspLogSink::setLogSink(logSinkImpl.get());

3.1.2 Proxy de callback AspLogSink

Descrições das interfaces de proxy:

Interface

Descrição

void debug(const std::string& tag, const std::string& msg)

Callback de log de depuração do SDK

void info(const std::string& tag, const std::string& msg)

Callback de log informativo do SDK

void warning(const std::string& tag, const std::string& msg)

Callback de log de aviso do SDK

void fatal(const std::string& tag, const std::string& msg)

Callback de log fatal do SDK

void error(const std::string& tag, const std::string& msg)

Callback de log de erro do SDK

Exemplo de código:

#include "AspLogSink.h"

using namespace wuying::asp;

class AspLogSinkImpl : public AspLogSink
{
public:
    AspLogSinkImpl() {

    }

    void debug(const std::string& tag, const std::string& msg) override {
        // Print debug log
    }
    void info(const std::string& tag, const std::string& msg) override {
        // Print info log
    }
    void warning(const std::string& tag, const std::string& msg) override {
        // Print warning log
    }
    void fatal(const std::string& tag, const std::string& msg) override {
        // Print fatal log
    }
    void error(const std::string& tag, const std::string& msg) override {
        // Print error log
    }
};

3,2 Interfaces de negócio de miniatura

3.2.1 suspendThumbnailDisplay

Protótipo da função: void suspendThumbnailDisplay()

Descrição da função: Suspende o streaming de imagens de miniatura.

Exemplo de código:

client->suspendThumbnailDisplay();

3.2.2 resumeThumbnailDisplay

Protótipo da função: void resumeThumbnailDisplay()

Descrição da função: Retoma o streaming de miniaturas e pode forçar o envio de um único frame.

Exemplo de código:

client->resumeThumbnailDisplay();

3,3 Recursos adicionais de controle principal

3.3.1 setOutputImageFormat

Protótipo da função: void setOutputImageFormat(AspImageFormat format)

Descrição da função: Define o formato do frame de callback do controle principal.

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

format

AspImageFormat

Formato do frame de callback do controle principal. Para detalhes, consulte 5,2 AspImageFormat.

Exemplo de código:

client->setOutputImageFormat(AspImageFormat::BGRA);

3.3.2 requestGraphicsKeyFrame

Protótipo da função: void requestGraphicsKeyFrame(AspDisplay* display) = 0;

Descrição da função: Envia um único keyframe para o fluxo de controle principal. O parâmetro é AspDisplay.

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

display

AspDisplay*

Ponteiro para a classe Display

Exemplo de código:

client->requestGraphicsKeyFrame(display);

3.3.3 setGraphicsQuality

Protótipo da função: void setGraphicsQuality(AspImageQuality quality) = 0;

Descrição da função: Define a qualidade da imagem. A qualidade depende da resolução. Geralmente, defina este parâmetro como AUTO. Para parâmetros detalhados, consulte a definição da struct.

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

quality

AspImageQuality

Qualidade da imagem. Para detalhes, consulte 5,4 AspImageQuality.

client->setGraphicsQuality(ASP_IMAGE_QUALITY_AUTO)

3.3.4 setGraphicsFps

Protótipo da função: void setGraphicsFps(int fps) = 0;

Descrição da função: Define os quadros por segundo (FPS).

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

fps

int

Taxa de quadros

Exemplo de código:

client->setGraphicsFps(30)

3.3.5 setGraphicsBitrate

Protótipo da função: void setGraphicsBitrate(int32_t bps) = 0;

Descrição da função: Define a taxa de bits, o que afeta o tamanho da imagem.

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

bps

int32_t

Taxa de bits

As taxas de bits a seguir servem apenas como referência:

Qualidade da imagem

Taxa de bits

Baixa qualidade

1×1024

Média

5×1024

Alta qualidade

10×1024

Sem perdas

50×1024

Exemplo de código:

client->setGraphicsBitrate(1*1024)

3,4 Mouse

3.4.1 sendMouseClick

Protótipo da função: void sendMouseClick(AspAction action, uint32_t button, uint32_t buttonState) = 0;

Descrição da função: Envia um evento de clique do mouse.

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

action

AspAction

Para detalhes, consulte 5,5 AspAction.

button

uint32_t

Para detalhes, consulte 5,6 AspMouseButtonMask.

buttonState

uint32_t

Para detalhes, consulte 5,7 AspMouseButton.

Exemplo de código:

// Mouse left button press
display->sendMouseClick(AspAction::ACTION_DOWN, ASP_MOUSE_BUTTON_MASK_L, ASP_MOUSE_BUTTON_LEFT);
// Mouse left button release
display->sendMouseClick(AspAction::ACTION_UP, ASP_MOUSE_BUTTON_MASK_L, ASP_MOUSE_BUTTON_LEFT);

3.4.2 sendMouseMove

Protótipo da função: virtual void sendMouseMove(uint32_t x, uint32_t y, uint32_t buttonState) = 0;

Descrição da função: Envia um evento de movimento do mouse.

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

x

uint32_t

Coordenada horizontal do Cloud Phone

y

uint32_t

Coordenada vertical do Cloud Phone

buttonState

uint32_t

Para detalhes, consulte 5,6 AspMouseButtonMask.

Exemplo de código:

// x and y are the Cloud Phone coordinates
sendMouseMove(x, y, ASP_MOUSE_BUTTON_MASK_L)

3,5 Teclado

3.5.1 sendKeyEvent

Protótipo da função: virtual void sendKeyEvent(AspAction action, int scancode) = 0;

Esta funcionalidade descreve eventos de teclado.

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

action

AspAction

Tipo de ação. Para detalhes, consulte 5,5 AspAction.

scancode

int

Código de varredura da tecla

Exemplo de código:

// Key press
display->sendKeyEvent(AspAction::ACTION_DOWN,scanCode);
// Key release
display->sendKeyEvent(AspAction::ACTION_UP,scanCode);

3,6 Área de transferência

Do ambiente local para a nuvem

Da nuvem para o ambiente local

3.6.1 setClipBoardTypes

Protótipo da função: virtual void setClipBoardTypes(std::vector<AspClipboardType> types) = 0;

Envia o formato de dados do conteúdo da área de transferência ao copiar para a área de transferência ou colar pressionando Ctrl+V. Apenas texto é suportado.

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

types

std::vector<AspClipboardType>

Array de tipos de área de transferência. Para detalhes, consulte 5,8 AspClipboardType.

Exemplo de código:

std::vector<AspClipboardType> types;
types.push_back(AspClipboardType::CLIPBOARD_UTF8_TEXT);
client->setClipBoardTypes(types);

3.6.2 notifyClipboardReadComplete

Protótipo da função: virtual void notifyClipboardReadComplete(AspClipboardType type, uint8_t* buf, size_t len) = 0;

Descrição da função: Envia conteúdo para o Cloud Phone. Esta função é chamada quando onClipboardRead(uint8_t selection, AspClipboardType type) é acionado.

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

type

AspClipboardType

Tipo de área de transferência. Atualmente suporta apenas texto.

buf

uint8_t*

Ponteiro para o array de bytes do conteúdo da área de transferência

len

size_t

Tamanho de buf

Exemplo de código:

void onClipboardRead(uint8_t selection, AspClipboardType type) override {
        // Triggered when copying from local to Cloud Phone via client->setClipBoardTypes(types)
        // Call notifyClipboardReadComplete to send clipboard content
        client->notifyClipboardReadComplete(type, reinterpret_cast<uint8_t *>(utf8Data.data()), utf8Data.size());
}

3.6.3 Proxy de callback IClipboardCallback

Descrições das interfaces de proxy:

Interface

Descrição

void onClipboardRead(uint8_t selection, AspClipboardType type)

Acionado ao copiar do ambiente local para o Cloud Phone via setClipBoardTypes(types). Chame notifyClipboardReadComplete para enviar o conteúdo da área de transferência. Para detalhes do tipo, consulte 5,8 AspClipboardType.

void onClipboardWrite(std::vector<AspClipboardData> dataV)

Acionado ao copiar do Cloud Phone para o ambiente local. Escreva dataV na área de transferência local. Para detalhes dos dados, consulte 4,6 AspClipboardData.

Exemplo de código:

class AspClipboardlmpl :public IClipboardCallback
{
public:
    AspClipboardlmpl() {};

    void onClipboardRead(uint8_t selection, AspClipboardType type) override {
        // Triggered when copying from local to Cloud Phone via client->setClipBoardTypes(types)
        // Call notifyClipboardReadComplete to send clipboard content
        //client->notifyClipboardReadComplete(type, reinterpret_cast<uint8_t *>(utf8Data.data()), utf8Data.size());
    }
    void onClipboardWrite(std::vector<AspClipboardData> dataV) override {
        // Write dataV to the local clipboard when copying from Cloud Phone
    }
};

3,7 Canal de comandos Shell

3.7.1 sendStringDataToShell

Protótipo da função: virtual bool sendStringDataToShell(const std::string& val) = 0;

Descrição da função: Envia um comando Shell.

Descrição dos parâmetros:

Nome do parâmetro

Tipo do parâmetro

Descrição

val

std::string

Comando ADB Shell no formato JSON: {"id":"","cmd":""}

Exemplo de código:

client->sendStringDataToShell(jsonString)

Comandos ADB comuns:

Função

Comando

Voltar

input keyevent KEYCODE_BACK

Início

input keyevent KEYCODE_HOME

Tecla de alternância

input keyevent KEYCODE_APP_SWITCH

Silenciar

input keyevent 164

Aumentar volume

input keyevent KEYCODE_VOLUME_UP

Diminuir volume

input keyevent KEYCODE_VOLUME_DOWN

Ocultar barra de navegação

setprop persist.wy.hasnavibar false; killall com.android.systemui

Mostrar barra de navegação

setprop persist.wy.hasnavibar true; killall com.android.systemui

Captura de tela

screencap -p /sdcard/Download/abc.png

3.7.2 Proxy de callback IShellCmdCallback

Descrições das interfaces de proxy:

Interface

Descrição

void onReceiveStringData(const std::string& val)

Recebe respostas de comandos Shell baseadas em string

void onReceiveRawData(const std::vector<uint8_t> val)

Recebe respostas de comandos Shell baseadas em bytes brutos

Exemplo de código:

class AspShellCmdlmpl :public IShellCmdCallback
{
public:
    AspShellCmdlmpl() {};

    void onReceiveStringData(const std::string& val) override {
        // Callback for string responses
    }
    void onReceiveRawData(const std::vector<uint8_t> val) override {
       // Callback for raw byte responses
    }
};

4. Detalhes dos parâmetros

4,1 AspTicket

struct AspTicket {
    std::string ticket; 		// Ticket string for accessing a Cloud Phone
    std::string id;			// Desktop ID
    std::string user;			// Username
    std::string uuid;			// Local UUID (must match the UUID used when requesting the ticket)
    std::string systemType;		// Operating system type
    uint8_t partner;			// Partner ID
    bool isThumbnailEnable = false;	// Whether thumbnail mode is enabled
};

4,2 ConnectEvent

struct ConnectEvent {
    ConnectEventType type;	// Event type such as connection success or failure
    int reason;				// Reason for the event trigger
};

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;				// Sample rate
    int channels;			// Channels
    int size;				// Data size
    uint8_t *data;			// Data address

    ReleaseBuffer releaseBuffer;	// Function to release data. Must be called after using data.
};

4,5 AspAudioPlayback

struct AspAudioPlayback {
    AspAudioReadType readType;	// Audio data retrieval method: PUSH or PULL
    AspAudioMode mode;		// PCM or OPUS
    uint32_t channels;		// Number of channels
    uint32_t frequency;		// Sample rate
    AspAudioFormat format;	// RAW or OPUS

    AudioReader audioReader;	// Function for data reading in PULL mode. Refer to the demo implementation.
};

4,6 AspClipboardData

struct AspClipboardData {
    AspClipboardType type;
    uint8_t* data;
    uint32_t size;
};

5. Enumerações

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 recursive */
    CLIPBOARD_HTML,
    CLIPBOARD_RTF,
    CLIPBOARD_XML_SPREAD_SHEET,
};

6. Códigos de erro

Código de erro

Mensagem de erro (%s representa um Cloud Phone ou aplicativo em nuvem)

Módulo

Causa

Os códigos de erro de 2 a 26 estão principalmente relacionados a problemas de rede.

2

Falha ao conectar a %s.

ASP SDK

Valor MAGIC inválido.

3

Falha ao conectar a %s.

ASP SDK

Dados inválidos.

4

As versões do cliente e do servidor não correspondem.

ASP SDK

Incompatibilidade de versão.

5

É necessária uma conexão TLS.

ASP SDK

O servidor exige uma conexão TLS, mas o cliente não iniciou uma.

6

Conexão TLS inesperada.

ASP SDK

A conexão não exige TLS, mas ele foi utilizado.

7

Permissão negada para conectar a %s.

ASP SDK

Permissões insuficientes.

8

id de cliente inválido durante a migração.

ASP SDK

id de cliente inválido durante a migração.

9

Falha ao conectar a %s.

ASP SDK

O canal não existe.

20

Falha ao conectar ao servidor ASP.

ASP SDK

Erro de conexão do canal.

21

Ocorreu um erro de autenticação TLS.

ASP SDK

Erro de autenticação TLS.

22

Falha ao conectar a %s.

ASP SDK

Erro de link do canal.

23

Falha ao conectar a %s.

ASP SDK

Erro de autenticação de conexão.

24

Falha ao conectar a %s.

ASP SDK

Erro de I/O de conexão.

25

Falha ao conectar a %s.

ASP SDK

Falha na validação do ticket. Este erro também ocorre ao reutilizar um ticket de uma sessão encerrada.

26

Falha no handshake xquic.

ASP SDK

Falha no handshake xquic.

1206

O ticket já está em uso.

ASP SDK

Um ticket pode ser reutilizado, mas apenas para uma conexão por vez. Este erro ocorre se você tentar estabelecer uma nova conexão enquanto o Cloud Phone já está em uso.

1207

Ticket invalidado pela reinicialização da instância.

ASP SDK

A instância foi reiniciada, o que invalidou o ticket.

Códigos de erro do SDK para modo colaborativo

1000

O token está vazio.

ASP SDK

Esses erros ocorrem apenas no modo colaborativo quando a validação secundária entre o cliente e o servidor falha.

1001

O usuário está vazio.

ASP SDK

1200

O token é inválido.

ASP SDK

1201

A VM é inválida.

ASP SDK

1202

Ocorreu um erro interno do administrador.

ASP SDK

1203

O usuário é inválido.

ASP SDK

1204

O token expirou.

ASP SDK

1500

Ocorreu um erro interno do servidor.

ASP SDK

1501

Ocorreu um erro de rede no servidor.

ASP SDK

Interrupções de conexão e outros erros

2000

Desconectado do servidor porque a busca de dados de %s atingiu o tempo limite.

ASP SDK

Tempo limite na busca de dados.

2001

%s desconectou do servidor, possivelmente porque seu processo foi encerrado.

ASP SDK

Isso geralmente ocorre quando o processo no lado do cliente é encerrado. Por exemplo, um aplicativo Android é fechado pelo usuário ao pressionar o botão Início.

2002

Outro usuário conectou-se ao %s atual a partir de um terminal diferente.

ASP SDK

A sessão foi assumida por outro usuário no modo preemptivo.

2003

%s está desligando ou reiniciando. Geralmente, trata-se de uma ação iniciada pelo administrador.

ASP SDK

O Cloud Phone foi desligado ou reiniciado, normalmente por um administrador.

2004

A conexão do usuário atual foi encerrada.

ASP SDK

O cliente iniciou a desconexão ou o servidor acionou uma ação de expulsão ou desconexão.

2005

Sessão desconectada: limite de tempo de uso atingido.

ASP SDK

A sessão foi encerrada porque atingiu o limite de duração de uso definido pelo administrador.

2006

Sua permissão para usar este Cloud Phone foi revogada pelo administrador. Você será desconectado.

ASP SDK

A autorização do usuário foi revogada por um administrador.

2010

Falha ao conectar a %s.

ASP SDK

Falha ao conectar ao Vdagent.

2011

Ocorreu um erro ao passar os parâmetros de conexão.

ASP SDK

Um parâmetro inválido foi passado ao conectar ao servidor.

2027

O modo de pull de fluxo foi alternado.

ASP SDK

O modo de pull de fluxo foi alternado de preemptivo para colaborativo, ou de colaborativo para preemptivo.

2100

Permissão de área de transferência negada para copiar de %s para o dispositivo local.

ASP SDK

O acesso à área de transferência da instância remota para o cliente local foi negado pela política.

2101

Permissão de área de transferência negada para copiar do dispositivo local para %s.

ASP SDK

O acesso à área de transferência do cliente local para a instância remota foi negado pela política.

2200

%s está tentando reconectar...

ASP SDK

A conexão foi perdida devido a um problema de rede e o ASP SDK está tentando reconectar.

2201

Seu dispositivo encontrou uma anomalia de rede, causando a desconexão de %s.

ASP SDK

A conexão foi perdida devido a um problema de rede. O ASP SDK não suporta reconexão devido a restrições de imagem; o lado do aplicativo deve iniciar a reconexão.

2202

Tempo limite na reconexão a %s.

ASP SDK

A tentativa de reconexão do ASP SDK atingiu o tempo limite.

2210

Conexão perdida enquanto o dispositivo cliente estava em suspensão.

ASP SDK

A rede local foi desconectada enquanto o dispositivo cliente estava em suspensão, o que causou a perda da conexão com o Cloud Phone.

2212

Conexão perdida devido a uma anomalia na rede local.

ASP SDK

Uma anomalia na rede local foi detectada, o que causou a desconexão do Cloud Phone.

2220

Conexão perdida devido a uma anomalia na rede local.

ASP SDK

Uma anomalia na rede local foi detectada, o que causou a desconexão do Cloud Phone.

2240

A reconexão falhou porque o token no ticket é inválido.

ASP SDK

2300

A conexão falhou devido a um parâmetro inválido do lado do aplicativo.

app-side

2501

O cliente falhou ao conectar ao gateway de fluxo. A rede está inacessível.

stream gateway

2502

O cliente falhou ao conectar ao gateway de fluxo. A conexão TCP com o endereço IP do gateway de fluxo atingiu o tempo limite após três tentativas (15 segundos no total).

stream gateway

2503

O cliente falhou ao conectar ao gateway de fluxo devido a um erro de rede desconhecido.

stream gateway

2504

O cliente falhou ao conectar ao gateway de fluxo. A conexão foi abortada pelo software.

stream gateway

2505

O cliente falhou ao conectar ao gateway de fluxo. A conexão foi recusada.

stream gateway

2506

O ticket é inválido. O gateway falhou ao analisar o token.

stream gateway

2507

O ticket é inválido porque expirou.

stream gateway

2508

O ticket é inválido devido a uma incompatibilidade de UUID.

stream gateway

2509

O gateway de fluxo falhou ao sondar o servidor ASP.

stream gateway

2510

A sonda para o servidor foi rejeitada. Solução: Certifique-se de que o servidor esteja escutando na porta 5912.

stream gateway

2511

A sonda para o servidor falhou devido a um erro diferente de tempo limite ou recusa.

stream gateway

2512

A validação do token do gateway de fluxo falhou.

O id da VPC no token de gerenciamento não corresponde ao id da VPC do gateway de fluxo.

stream gateway

2513

A conexão TCP foi redefinida durante o handshake "SayHello" entre o cliente e o gateway de fluxo.

stream gateway

2520

A conexão do cliente falhou; uma verificação de autodiagnóstico indica uma anomalia de rede.

ASP SDK

2521

O cliente foi desconectado após três tentativas de reconexão falharem durante a fase de handshake TLS com o gateway de fluxo.

ASP SDK

2522

Ocorreu um erro de conexão em um ambiente VPN.

ASP SDK

2523

O cliente está tentando conectar usando o conjunto de protocolos GM/T. Verifique a configuração do servidor ou selecione um método de conexão compatível.

ASP SDK

2701

Ocorreu um problema de rede no lado do cliente.

ASP SDK

2702

O handshake SSL entre o cliente e o gateway de fluxo atingiu o tempo limite.

ASP SDK

2703

O handshake "SayHello" entre o cliente e o gateway de fluxo atingiu o tempo limite.

ASP SDK

2704

A resposta do servidor ASP à solicitação de estabelecimento de conexão atingiu o tempo limite.

Possíveis causas: O servidor ASP não responde, anomalia de rede, instância congelada ou alto uso de memória/CPU.

ASP SDK

2705

O cliente ASP atingiu o tempo limite enquanto aguardava o primeiro frame.

Possíveis causas: O servidor ASP não responde, nenhum frame está sendo gerado devido a um problema de captura de tela ou driver de GPU, anomalia de rede ou alto uso de memória/CPU.

ASP SDK

2706

Alto uso local de CPU ou memória no cliente pode causar falhas de conexão.

ASP SDK

2707

O servidor ASP atingiu o tempo limite ao recuperar o primeiro frame de captura de tela do SO convidado.

ASP SDK

2708

A conexão falhou porque uma thread do SDK está travada.

ASP SDK

Erros de lógica do lado do cliente

5100

A conexão de %s com o servidor ASP atingiu o tempo limite.

app-side

O lado do cliente não recebeu um evento "connected" dentro do período de tempo especificado.

5102

A busca de dados de %s atingiu o tempo limite.

app-side

O lado do cliente recebeu um evento "connected", mas não recebeu um evento "display" dentro do período de tempo especificado.

5004

Parâmetros de inicialização inválidos.

app-side

Parâmetros de inicialização inválidos foram passados para o lado do cliente. Isso geralmente ocorre durante o desenvolvimento.

5200

Tempo limite na reconexão do cliente.

app-side

7. Perguntas frequentes

Como reiniciar um Cloud Phone?

Chame a API de gerenciamento Reiniciar instância para reiniciar o Cloud Phone. Após chamar essa API, a conexão do lado do cliente com o Cloud Phone é interrompida. Reconecte-se após a conclusão da reinicialização.

Alternar entre miniatura e controle principal

Para alternar da miniatura para o controle principal, primeiro feche a conexão da miniatura e aguarde a conclusão da desconexão antes de abrir a conexão de controle principal.

image.svg

Para alternar do controle principal para a miniatura, primeiro feche a conexão de controle principal e aguarde a conclusão da desconexão antes de reabrir a conexão da miniatura.

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