Todos os produtos
Search
Central de documentação

Cloud Phone:Android SDK

Última atualização: Jun 30, 2026

O Alibaba Cloud Workspace SDK para Android oferece uma interface aberta para conexão com cloud computers, cloud apps e cloud phones. Ao integrar o SDK, você personaliza e cria rapidamente um cliente Android adaptado às necessidades do seu negócio.

1. Início rápido

1,1 Obter o SDK e a demo

Nota

Ao baixar e utilizar o SDK, você concorda com a Política de Privacidade do Alibaba Cloud Workspace SDK.

Estes documentos, SDKs e clientes destinam-se apenas a uso interno. Não os distribua a terceiros sem a permissão da Alibaba Cloud.

Requisitos de ambiente

Versão mínima suportada do Android: 5,1

Integração do pacote AAR

  • Copie os arquivos aspengine-third-release.aar, aspengine-player-release.aar e wytrace-release.aar para o diretório app/libs.

  • Adicione as seguintes dependências ao arquivo build.gradle do módulo do seu aplicativo:

dependencies {
    implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
    // The INI configuration parsing library required by aspengine-sdk.
    implementation 'org.ini4j:ini4j:0.5.4'
    // The libraries required by wytrace.
    implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.8'
    implementation 'com.google.code.gson:gson:2.10.1'
    implementation 'io.github.aliyun-sls:aliyun-log-android-sdk:2.7.0@aar'
}
  • Declare as permissões necessárias no arquivo AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE"/>
  • Configure as regras de keep do ProGuard:

-keep class com.aliyun.wuying.aspsdk.** { *; }
-dontwarn com.aliyun.wuying.aspsdk.**

1,2 Processo de integração

image

1,3 Melhores práticas

Consulte Melhores práticas para integração do Cloud Phone.

image

Vários métodos de logon estão disponíveis para obter o ticket de conexão necessário à integração do SDK.

image

Para exemplos de código, consulte o código de amostra das interfaces de ciclo de vida.

2. Interfaces de ciclo de vida

2,1 Inicializar uma instância StreamView

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   requestWindowFeature(Window.FEATURE_NO_TITLE);
   getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
   setContentView(R.layout.activity_stream_view_demo);
   mStreamView = findViewById(R.id.stream_view);
   mStreamView.enableDesktopMode(false);
   mStreamView.scaleStreamVideo(pref.getBoolean("fit_video_content", true) ?
   mStreamView.ScaleType.FIT_STREAM_CONTENT : StreamView.ScaleType.FILL_STREAM_VIEW);
   mStreamView.getASPEngineDelegate().setAlignStreamResolutionWithSurfaceSize(false);
}
<?xml version="1.0" encoding="utf-8"?>
<android.widget.RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".StreamViewDemoActivity">

    <com.aliyun.wuying.aspsdk.aspengine.ui.StreamView
        android:id="@+id/stream_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:focusableInTouchMode="true"
        android:focusable="true"
        android:focusedByDefault="true" />

</android.widget.RelativeLayout>

2,2 Estabelecer uma conexão

Para obter informações sobre os valores de mConfigs, consulte a Seção 4,1.

mStreamView.start(mConfigs);

2,3 Fechar a conexão

mStreamView.stop();

2,4 Destruir uma instância StreamView

mStreamView.dispose();
mStreamView = null;

2,5 Modo Multi-StreamView

Este modo permite alternar perfeitamente um único stream entre várias instâncias View. Para implementar este modo, siga estas etapas:

  1. Defina e inicialize as instâncias StreamView conforme descrito na Seção 2,1.

  2. Utilize IAspEngine para estabelecer uma conexão. Os parâmetros devem ser consistentes com a definição de Config na Seção 4,1.

    IASPEngine engine = mBuilder.enableRTC(true).build(context);
    // Enable data statistics.
    engine.enableStatistics(true, true);
    ConnectionConfig cc = new ConnectionConfig();
    cc.id = CONFIG_DESKTOP_ID;
    cc.connectionTicket = CONFIG_CONNECTION_TICKET;
    cc.useVPC = CONFIG_USE_VPC;
    cc.type = OS_TYPE;
    cc.user = CONFIG_USER;
    cc.uuid = CONFIG_UUID;
    
    engine.start(cc);
  3. Vincule o IAspEngine a um StreamView. Esta chamada renderiza o stream na View especificada.

    mStreamView.bindASPEngine(engine);
  4. Retome a renderização em um StreamView. Esta chamada instrui a View a retomar a renderização do stream.

    mStreamView.resumeASPEngine();

Para mais detalhes, consulte a implementação no aplicativo de demonstração.

2,6 Callbacks

Proxy de callback de conexão: IASPEngineListener

Descrição da interface:

API

Descrição

onConnectionSuccess(int connectionId)

Disparado quando uma conexão com o cloud phone é estabelecida com sucesso. Retorna o ID da conexão.

onConnectionFailure(int errorCode, String errorMsg)

Disparado se a conexão com o cloud phone falhar. Retorna o código de erro e a mensagem de erro.

onEngineError(int errorCode, String errorMsg)

Disparado quando ocorre um erro interno do SDK. Retorna o código de erro e a mensagem de erro.

onDisconnected(int reason)

Disparado quando a conexão é interrompida. Retorna o código inteiro do motivo da desconexão.

onReconnect(int errorCode)

Disparado quando o SDK tenta reconectar após uma desconexão. Retorna o código de erro que acionou a reconexão.

onFirstFrameRendered(long timeCostMS)

Disparado quando o primeiro quadro de vídeo é renderizado. Retorna o tempo decorrido desde o início da conexão até o primeiro quadro, em milissegundos.

onPolicyUpdate(String policy)

Disparado quando uma atualização de política é recebida do cloud phone. Retorna a configuração da política como uma string.

onSessionSuccess()

Disparado quando a sessão de streaming é estabelecida com sucesso.

Proxy de callback de dados de desempenho: IStatisticsListener

Descrição da interface:

API

Descrição

onStatisticsInfoUpdate(StatisticsInfo statisticsInfo)

Disparado periodicamente para fornecer dados de desempenho. Retorna um objeto StatisticsInfo contendo as métricas mais recentes.

Proxy de callback de solicitação de permissão do sistema: IRequestSystemPermissionListener

Descrição da interface:

API

Descrição

bool OnRequestSystemPermission(SystemPermission permission)

Disparado quando o SDK precisa solicitar uma permissão do sistema. O parâmetro permission indica o tipo de permissão necessária.

Código de exemplo para registrar e cancelar o registro de callbacks:

// Listen for connection callbacks.
mStreamView.getASPEngineDelegate().registerASPEngineListener(IASPEngineListener listener);
mStreamView.getASPEngineDelegate().unregisterASPEngineListener(IASPEngineListener listener);
// Listen for performance data callbacks.
mStreamView.getASPEngineDelegate().registerStatisticsListener(IStatisticsListener listener);
mStreamView.getASPEngineDelegate().unregisterStatisticsListener(IStatisticsListener listener);
// Listen for system permission requests.
mStreamView.registerSystemPermissionListener(IRequestSystemPermissionListener listener);
mStreamView.unregisterSystemPermissionListener(IRequestSystemPermissionListener listener);

3. API de Serviço

API

Descrição

enableVDAgentCheck(boolean enabled)

Define se deve impor uma verificação de disponibilidade do VDAgent ao estabelecer uma conexão. Esta verificação está ativada por padrão.

Se definido como true e o VDAgent estiver indisponível durante o estabelecimento da conexão, um erro será reportado e a conexão atual será encerrada.

Não recomendamos definir este parâmetro como false, exceto para fins de depuração interna.

enableRTC(boolean enabled)

Define se deve usar RTC para transmitir dados de streaming. O RTC é usado por padrão.

enableDesktopMode(boolean enabled)

Ativa ou desativa o modo desktop. Quando ativado, todas as entradas de toque são convertidas em eventos de mouse e enviadas ao servidor. Para cloud phones, recomendamos definir isso como false.

scaleStreamVideo(ScaleType scaleType)

Especifica o comportamento de dimensionamento para o stream de vídeo. Para valores válidos de ScaleType, consulte o tipo enum 5,1 ScaleType.

setVideoProfile(int width, int height, int fps, IRemoteResult result)

Define a resolução para o stream de vídeo. O parâmetro fps (taxa de quadros) não é suportado atualmente.

boolean sendKeyEvent(KeyEvent event)

e

sendKeyboardEvent(KeyEvent event, IRemoteResult result)

Envia eventos de teclado para a sessão remota.

boolean simulateMouseClick(boolean leftButton)

Simula um clique do mouse na sessão remota. Defina o parâmetro como true para um clique esquerdo ou false para um clique direito.

boolean enableMouseMode(boolean enabled)

Ativa ou desativa o modo mouse.

boolean sendMouseEvent(MotionEvent motionEvent)

e

sendMouseEvent(MotionEvent motionEvent, IRemoteResult result)

Envia eventos de mouse para a sessão remota.

reconnect(String connectionToken)

Reconecta à sessão após uma desconexão inesperada.

Este método é tipicamente usado para lidar com uma desconexão com reason=2200. Para reconectar, seu aplicativo deve chamar a OpenAPI para obter um novo token de conexão para o cloud phone e então passá-lo a este método.

boolean setMediaStreamPlayer(MediaStreamPlayer player)

Substitui o mecanismo de mídia padrão do SDK por um mecanismo personalizado fornecido pelo seu aplicativo. Este método deve ser chamado antes de iniciar o streaming ou após o stream ser desconectado.

void setAlignStreamResolutionWithSurfaceSize(boolean aligned)

Ativa ou desativa o alinhamento automático da resolução do stream com o tamanho da SurfaceView no lado do cliente quando o streaming começa. Este recurso está ativado por padrão. Para cloud phones, recomendamos desativar este recurso.

void mute(boolean muted)

Ativa ou desativa o modo mudo.

void enableStatistics(boolean enabled)

Ativa ou desativa a coleta de dados de desempenho.

mStreamView.getASPEngineDelegate().requestIFrame()

Solicita um quadro-chave.

Em mStreamView.getASPEngineDelegate():

registerFileTransferListener(IFileTransferListener var1)

e

unregisterFileTransferListener(IFileTransferListener var1)

e

mStreamView.getASPEngineDelegate().uploadFiles(pathList, "/sdcard/Download/");

Gerencia upload e download de arquivos. Para detalhes de implementação, consulte o aplicativo de demonstração.

Em mStreamView.getASPEngineDelegate():

addDataChannel(DataChannel var1)

e

removeDataChannel(DataChannel var1)

Adiciona ou remove um canal de dados personalizado para trocar dados com a sessão remota. Para detalhes de implementação, consulte o aplicativo de demonstração.

Em mStreamView.getASPEngineDelegate():

addLyncChannel(LyncChannel var1)

e

removeLyncChannel(LyncChannel var1)

Adiciona ou remove o canal para envio de comandos ADB. Para detalhes de implementação, consulte AspAdbUtil no aplicativo de demonstração.

void setToQualityFirst()

Define o modo de prioridade de qualidade. Este modo suporta uma taxa de quadros máxima de 30 fps e a qualidade da imagem é definida como Alta. Não suportado em cloud phones.

void setToFpsFirst()

Define o modo de prioridade de fluidez. Este modo suporta uma taxa de quadros máxima de 60 fps e a qualidade da imagem é definida como Boa. Não suportado em cloud phones.

void setToCustomPicture(int fps, int quality);

Define um modo personalizado que permite especificar a taxa de quadros e a qualidade da imagem.

O parâmetro fps aceita valores de 0 a 60. Um valor maior resulta em um vídeo mais fluido.

O parâmetro quality aceita valores de 0 a 4, onde 0 é sem perdas, 1 é alta, 2 é boa, 3 é regular e 4 é automática. Não suportado em cloud phones.

Em mStreamView.getASPEngineDelegate():

registerIMEListener, unregisterIMEListener, setImeType, enableRelativeMouse, etc.

Não suportado em cloud phones.

4. Parâmetros

4,1 Config

Utilize estes parâmetros para estabelecer uma conexão.

Parâmetro

Tipo

Descrição

StreamView.CONFIG_DESKTOP_ID

string

O ID da instância. Este valor corresponde ao ResourceId retornado pela API DescribeUserResources.

StreamView.CONFIG_CONNECTION_TICKET

string

O ticket de autenticação de conexão. Obtenha este ticket chamando a API GetConnectionTicket.

StreamView.CONFIG_PREFER_RTC_TRANSPORT

boolean

Habilita o canal RTC quando definido como true. Esta configuração é recomendada para cloud phone.

StreamView.CONFIG_ENABLE_VDAGENT_CHECK

boolean

Habilita uma verificação de disponibilidade do VDAgent durante a conexão quando definido como true. Esta configuração é recomendada para cloud phone.

StreamView.CONFIG_ENABLE_STATISTICS

boolean

Defina como true para habilitar estatísticas de desempenho, que serão exibidas como uma sobreposição no stream de vídeo. Esta configuração é recomendada para cloud phone.

OSType

string

O tipo de sistema operacional. Deve ser definido como android para cloud phone.

4,2 StatisticsInfo

Dados de desempenho

API

Tipo

Descrição

mReceiveFps

int

Taxa de quadros recebidos

mRenderFps

int

Taxa de quadros renderizados

mDownstreamBandwithMBPerSecond

double

Largura de banda downstream

mUpstreamBandwithMBPerSecond

double

Largura de banda upstream

mP2pFullLinkageLatencyMS

long

Latência ponta a ponta (obsoleto)

mNetworkLatencyMS

long

RTT de rede

mPingGatewayRttMS

long

RTT de ping

mLostRate

double

Taxa de perda de pacotes

mServerRenderLatencyMS

long

Latência de renderização na nuvem

mServerEncoderLatencyMS

long

Latência de codificação na nuvem

mServerTotalLatencyMS

long

Latência total na nuvem

mTotalDownstreamBandwidth

long

Largura de banda downstream total

mGuestCpuUsage

long

Uso de CPU do guest

mStreamType

String

Protocolo de streaming

5. Tipos de enumeração

5,1 ScaleType

Especifica como a imagem transmitida é dimensionada para caber no StreamView.

Parâmetro

Descrição

FILL_STREAM_VIEW

Estica a imagem transmitida para preencher todo o StreamView. Esta configuração não preserva a proporção original da imagem, o que pode distorcê-la se as proporções não coincidirem.

FIT_STREAM_CONTENT

Dimensiona a imagem transmitida para caber dentro do StreamView mantendo sua proporção original. Isso evita distorção, mas pode deixar áreas vazias se as proporções da imagem e da visualização forem diferentes.

5,1 SystemPermission

Especifica as permissões do sistema.

Parâmetro

Descrição

RECORDAUDIO

Permite a gravação de áudio.

6. Personalizando MediaStreamPlayer

Nota

Uma implementação multimídia personalizada não é obrigatória, pois o SDK fornece uma implementação padrão.

6,1 Processar dados de mídia

A implementação de com.aliyun.wuying.aspsdk.aspengine.MediaStreamPlayer permite que um aplicativo use um mecanismo de mídia personalizado para processar dados de streaming de mídia, que consistem principalmente em:

  • Dados de stream de vídeo: Um stream de vídeo bruto composto principalmente por quadros compactados H.264/H.265.

  • Stream de imagem adaptativo: Um stream de imagem consistindo principalmente em bitmaps.

  • Dados downstream de áudio: Um stream de áudio principalmente no formato Opus/PCM.

  • Dados de cursor: Quando o modo de mouse virtual está ativado, o aplicativo recebe dados de imagem e posição do cursor, permitindo que ele renderize independentemente um cursor virtual.

Um aplicativo pode chamar IASPEngine.setMediaStreamPlayer para definir uma implementação personalizada de mecanismo de mídia para o Alibaba Cloud Workspace SDK.

6,2 MediaStreamPlayer

MediaStreamPlayer é uma classe abstrata que exige que os aplicativos implementem métodos globais de inicialização e limpeza, além de fornecer uma implementação personalizada para lidar com diferentes tipos de dados de mídia:

image.png

Onde:

  • A interface IVideoStreamHandler serve para manipular dados de stream de vídeo.

  • A interface IAdaptiveGraphicStreamHandler serve para manipular dados de stream gráfico adaptativo.

  • A interface IAudioPlaybackStreamHandler serve para manipular dados de reprodução de áudio.

  • A interface ICursorBitmap serve para manipular dados de cursor.

Um aplicativo pode implementar uma ou mais das interfaces anteriores. O Alibaba Cloud Workspace SDK determina o tipo de streaming na nuvem com base nas interfaces implementadas, da seguinte forma:

  • Se o aplicativo implementar tanto IVideoStreamHandler quanto IAdaptiveGraphicStreamHandler, o modo de streaming será definido como Misto. Neste modo, o Alibaba Cloud Workspace alterna automaticamente entre o stream gráfico adaptativo e o stream de vídeo.

  • Se o aplicativo implementar apenas IVideoStreamHandler, o modo de streaming será definido como Apenas stream de vídeo, e o servidor fornecerá somente um stream de vídeo.

  • Se o aplicativo implementar apenas IAdaptiveGraphicStreamHandler, o modo de streaming será definido como Apenas stream de imagem, e o servidor fornecerá somente um stream de imagem.

Para personalizar como o SDK lida com diferentes tipos de dados de mídia, implemente os métodos onCreateXXXHandler em MediaStreamPlayer:

    @Override
    protected IVideoStreamHandler onCreateVideoStreamHandler() {
        return new VideoStreamHandler();
    }

    @Override
    protected IAdaptiveGraphicStreamHandler onCreateAdaptiveGraphicStreamHandler() {
        return null;
    }

    @Override
    protected IAudioPlaybackStreamHandler onCreateAudioPlaybackStreamHandler() {
        return new AudioPlaybackStreamHandler();
    }

    @Override
    protected ICursorBitmapHandler onCreateCursorBitmapHandler() {
        return null;
    }

No exemplo acima, o mecanismo de mídia personalizado implementa tanto IVideoStreamHandler quanto IAudioPlaybackStreamHandler. O método onCreateXXXHandler é executado apenas uma vez por sessão de streaming.

Chamando o método principal:

image

6,2,1 initialize

Seu aplicativo implementa este método para inicializar globalmente o mecanismo de mídia personalizado.

O sistema chama este método uma vez durante cada processo de streaming.

public ErrorCode initialize()

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,2,2 release

Libera todos os recursos globais associados ao mecanismo de mídia personalizado.

Este método é chamado uma vez durante cada sessão de streaming.

public ErrorCode release()

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,2,3 enableStatistics

Use este método para ativar ou desativar a coleta de estatísticas de desempenho.

public void enableStatistics(boolean enabled)

Parâmetros

Parâmetro

Tipo

Descrição

enabled

boolean

true

false

6,2,4 onCreateVideoStreamHandler

Fornece uma implementação de mecanismo de mídia para manipular dados de stream de vídeo.

O SDK executa este método uma vez por stream.

public IVideoStreamHandler onCreateVideoStreamHandler()

Valor de retorno

Tipo

Descrição

IVideoStreamHandler

A implementação do mecanismo de mídia que o aplicativo fornece para manipular dados de stream de vídeo.

Retorne null se o aplicativo não fornecer uma implementação. Nesse caso, o SDK descarta os dados do stream de vídeo.

6,2,5 onCreateAdaptiveGraphicStreamHandler

Fornece uma implementação de mecanismo de mídia para manipular dados de stream gráfico adaptativo.

O SDK chama este método uma vez por sessão de streaming.

public IAdaptiveGraphicStreamHandler onCreateAdaptiveGraphicStreamHandler()

Valor de retorno

Tipo

Descrição

IAdaptiveGraphicStreamHandler

A implementação do mecanismo de mídia do seu aplicativo para manipular dados de stream gráfico adaptativo.

Se seu aplicativo não fornecer uma implementação, retorne null. Nesse caso, o SDK não processa os dados do stream gráfico.

6,2,6 onCreateAudioPlaybackStreamHandler

Fornece uma implementação de mecanismo de mídia para processar dados downstream de áudio.

O SDK chama este método uma vez por sessão de streaming.

public IAudioPlaybackStreamHandler onCreateAudioPlaybackStreamHandler()

Valor de retorno

Tipo

Descrição

IAudioPlaybackStreamHandler

Uma implementação de mecanismo de mídia fornecida pelo aplicativo que processa dados downstream de áudio.

Se o aplicativo não fornecer nenhuma implementação, retorne null. Nesse caso, o SDK não processa os dados downstream de áudio.

6,2,7 onCreateCursorBitmapHandler

Fornece ao SDK um mecanismo de mídia para processamento de dados de cursor.

O SDK chama este método uma vez por sessão de streaming.

O SDK usa a implementação da interface retornada apenas no modo de mouse virtual.

public ICursorBitmapHandler onCreateCursorBitmapHandler()

Valor de retorno

Tipo

Descrição

ICursorBitmapHandler

A implementação do mecanismo de mídia para processamento de dados de cursor.

Retorne null se seu aplicativo não implementar o processamento de dados de cursor. Nesse caso, o SDK não processa dados de cursor, mesmo no modo de mouse virtual.

6,3 IVideoStreamHandler

Esta interface fornece os métodos primários para manipular streams de vídeo. O fluxo de trabalho principal é o seguinte:

image

Quando o aplicativo alterna entre primeiro plano e segundo plano, a Surface usada para renderização é destruída ou recriada. Nesse caso, o método IVideoStreamHandler.setVideoSurface é chamado repetidamente. Quando a Surface é destruída, o objeto surface passado para setVideoSurface é null. Seu aplicativo deve tratar falhas no decodificador e no renderizador.

Ao implementar o método IVideoStreamHandler.setEventHandler, um aplicativo obtém a interface de tratamento de eventos fornecida pelo Alibaba Cloud Workspace SDK. O aplicativo usa essa interface para notificar o SDK sobre eventos de processamento de vídeo de seu mecanismo de mídia personalizado, principalmente para coletar dados de desempenho.

    @Override
    public void setEventHandler(EventHandler handler) {
        Log.i(TAG, "setEventHandler handler " + handler);
        VideoStreamEventHandler.getInstance().reset(handler);
    }

...
    
    public synchronized void onVideoFrameRendered() {
        VFrame frame = mVideoFrame.remove();
        if (mEnabled && mHandler != null) {
            Event event = new Event();
            event.type = EventType.RENDER_PERF_INFO;
            event.decodePerfInfo = new VDecodePerfInfo();
            event.renderPerfInfo = new VRenderPerfInfo();
            event.renderPerfInfo.frameId = frame.frameId;
            event.renderPerfInfo.sessionId = frame.sessionId;
            // Notifies the Wuying SDK that a video frame has been rendered. The SDK then uses the frameId to calculate the client-side end-to-end latency.
            mHandler.callback(event);
        }
    }

6,3,1 setEventHandler

Chamado quando o SDK carrega o mecanismo de mídia personalizado. Fornece um EventHandler para enviar eventos de processamento de stream de vídeo.

public void setEventHandler(EventHandler handler)

Parâmetros

Parâmetro

Tipo

Descrição

handler

EventHandler

Um objeto fornecido pelo Alibaba Cloud Workspace SDK que seu aplicativo usa para enviar eventos de processamento de stream de vídeo ao SDK.

6,3,2 addVideoTrack

Chamado quando um stream de vídeo é criado.

Atualmente, apenas um stream de vídeo pode existir em uma única sessão de streaming.

ErrorCode addVideoTrack(int trackId, VProfile profile);

Parâmetros

Parâmetro

Tipo

Descrição

trackId

int

O ID do stream de vídeo.

profile

VProfile

Informações sobre o stream de vídeo.

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,3,3 setVideoSurface

Chamado quando a Surface de renderização de vídeo muda de estado.

ErrorCode setVideoSurface(int trackId, Surface surface);

Parâmetros

Parâmetro

Tipo

Descrição

trackId

int

O ID do stream de vídeo.

surface

android.view.Surface

O objeto Surface de renderização.

Este valor pode ser null quando o aplicativo entra em segundo plano ou o dispositivo é bloqueado.

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,3,4 playVideo

Seu aplicativo deve implementar este método. O SDK o chama quando um stream de vídeo está pronto para reprodução.

ErrorCode playVideo(int trackId);

Parâmetros

Parâmetro

Tipo

Descrição

trackId

int

O ID do stream de vídeo.

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,3,5 removeVideoTrack

Remove o stream de vídeo especificado.

ErrorCode removeVideoTrack(int trackId);

Parâmetros

Parâmetro

Tipo

Descrição

trackId

int

O ID do stream de vídeo.

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,3,6 pushVideoFrame

Você implementa este método em seu aplicativo. O SDK chama este método quando recebe um novo quadro de vídeo.

ErrorCode pushVideoFrame(int trackId, VFrame frame);

Parâmetros

Parâmetro

Tipo

Descrição

trackId

int

O ID do stream de vídeo.

frame

VFrame

O quadro de vídeo recebido.

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,3,7 getVideoTracks

Retorna informações sobre todos os streams de vídeo atualmente em processamento.

HashMap<Integer, VProfile> getVideoTracks();

Valor de retorno

Tipo

Descrição

HashMap<Integer, VProfile>

Um HashMap contendo informações sobre todos os streams de vídeo em processamento.

6,3,8 release

Este método é implementado pelo aplicativo. Ele é chamado quando todos os streams de vídeo são destruídos, permitindo que o aplicativo realize a limpeza.

ErrorCode release();

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,4 IAudioPlaybackStreamHandler

Esta interface fornece métodos para manipular dados de stream de áudio. O fluxo de trabalho é o seguinte:

image

6,4,1 initAudio

Chamado quando um canal de áudio é criado.

ErrorCode initAudio();

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,4,2 deInitAudio

Chamado quando um canal de áudio é destruído.

ErrorCode deInitAudio();

Retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,4,3 startAudioPlayback

Chamado antes que o cloud phone comece a enviar o stream de áudio.

ErrorCode startAudioPlayback();

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,4,4 stopAudioPlayback

Seu aplicativo implementa este método. O SDK chama este método quando o cloud phone para de enviar o stream de áudio.

ErrorCode stopAudioPlayback();

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,4,5 pushAudioPlaybackFrame

Seu aplicativo implementa este método. O SDK chama este método quando um novo quadro de áudio downstream é recebido.

ErrorCode pushAudioPlaybackFrame(AFrame pbData);

Parâmetros

Parâmetro

Tipo

Descrição

pbData

AFrame

O quadro de áudio downstream recebido.

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,4,6 updateAudioPlaybackVol

Chamado quando o volume do sistema do cloud phone muda.

ErrorCode updateAudioPlaybackVol(int volume);

Parâmetros

Parâmetro

Tipo

Descrição

volume

int

O valor varia de 0 (mudo) a USHRT_MAX.

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,4,7 updateAudioPlaybackMute

Chamado quando o cloud phone é silenciado ou tem o som reativado.

ErrorCode updateAudioPlaybackMute(int mute);

Parâmetros

Parâmetro

Tipo

Descrição

mute

int

Indica o status de mudo. Um valor de 1 significa que o cloud phone está silenciado, e 0 significa que o som está ativo.

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,4,8 release

Este método é implementado pelo aplicativo. Ele é chamado quando um canal de áudio é destruído para permitir que o aplicativo realize a limpeza.

ErrorCode release();

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,5 IAdaptiveGraphicStreamHandler

Esta interface fornece métodos para processar dados de stream de imagem. O fluxo de trabalho é o seguinte:

image

O aplicativo recebe quadros de imagem como bitmaps ARGB8888.

Cada sessão de streaming suporta no máximo um stream de imagem.

6,5,1 setAdaptiveGraphicSurface

Chamado quando o estado da Surface usada para renderização de imagem muda.

ErrorCode setAdaptiveGraphicSurface(Surface surface);

Parâmetros

Parâmetro

Tipo

Descrição

surface

android.view.Surface

A Surface para renderização de imagem.

Este objeto pode ser null quando o aplicativo entra em segundo plano ou a tela é bloqueada.

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,5,2 invalidateAdaptiveGraphicSurface

Chamado quando novos dados de quadro gráfico adaptativo estão disponíveis.

ErrorCode invalidateAdaptiveGraphicSurface(Region region, byte[] buffer, BitmapFormat format);

Parâmetros

Parâmetro

Tipo

Descrição

region

Region

A área de desenho para o quadro gráfico adaptativo.

buffer

byte[]

Os dados do quadro gráfico adaptativo.

format

BitmapFormat

O formato do quadro gráfico adaptativo. O padrão é ARGB8888.

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,5,3 release

Chamado quando o stream de imagem é destruído para realizar a limpeza.

ErrorCode release();

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,6 ICursorBitmapHandler

Esta interface define os métodos primários para manipular dados de cursor. Para renderizar a imagem do cursor no modo de mouse virtual, o aplicativo deve fornecer ao SDK uma implementação desta interface. O fluxo de trabalho principal é o seguinte:

image

6,6,1 setCursorBitmap

Chamado quando o gráfico do cursor no cloud phone muda.

ErrorCode setCursorBitmap(CursorBitmap bitmap);

Parâmetros

Parâmetro

Tipo

Descrição

bitmap

CursorBitmap

Os dados gráficos do cursor do cloud phone.

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,6,2 unsetCursorBitmap

Chamado quando o cursor no cloud phone é ocultado.

ErrorCode unsetCursorBitmap();

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,6,3 setCursorPosition

Define a posição do cursor no cloud phone.

ErrorCode setCursorPosition(float x, float y);

Parâmetros

Parâmetro

Tipo

Descrição

x

float

A coordenada x do cursor.

y

float

A coordenada y do cursor.

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

6,6,4 release

Chamado após a desconexão e o desaparecimento do cursor para realizar a limpeza.

ErrorCode release();

Valor de retorno

Tipo

Descrição

ErrorCode

ErrorCode.OK em caso de sucesso, ou um código de erro em caso de falha.

Códigos de erro

Código de erro

Mensagem de erro (%s representa um cloud phone ou cloud app)

Módulo

Causa

Os códigos de erro 2–26 estão relacionados principalmente 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 requer uma conexão TLS, mas o cliente não iniciou uma.

6

Conexão TLS inesperada.

ASP SDK

A conexão não requer TLS, mas foi utilizada.

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 de administração.

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 do 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 de 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 pressionando o botão Home.

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, esta é uma ação iniciada por um 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 parâmetros de conexão.

ASP SDK

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

2027

O modo de pull de stream foi alternado.

ASP SDK

O modo de pull de stream foi alternado de modo preemptivo para modo colaborativo, ou de modo colaborativo para modo 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 é 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 é 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 de 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 stream. A rede está inacessível.

stream gateway

2502

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

stream gateway

2503

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

stream gateway

2504

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

stream gateway

2505

O cliente falhou ao conectar ao gateway de stream. 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 stream falhou ao sondar o servidor ASP.

stream gateway

2510

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

stream gateway

2511

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

stream gateway

2512

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

O ID da VPC no token de gerenciamento não corresponde ao ID da VPC do gateway de stream.

stream gateway

2513

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

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 stream.

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 stream atingiu o tempo limite.

ASP SDK

2703

O handshake "SayHello" entre o cliente e o gateway de stream 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 quadro.

Possíveis causas: O servidor ASP não responde, nenhum quadro 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 quadro de captura de tela do SO convidado.

ASP SDK

2708

A conexão falhou porque um thread do SDK está travado.

ASP SDK

Erros de lógica do lado do cliente

5100

A conexão de %s ao 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 de reconexão do cliente.

app-side

8. FAQ

Reiniciar um cloud phone

Para reiniciar um cloud phone, chame a API RebootAndroidInstancesInGroup. Esta ação desconecta temporariamente o cliente do cloud phone. Após a conclusão da reinicialização, você precisará reconectar a partir do cliente.

Maven público

A hospedagem Maven pública não é suportada atualmente. Para integrar o SDK, faça upload da biblioteca AAR para seu próprio repositório Maven.

Comandos ADB comuns

Recurso

Comando

Botão Voltar

input keyevent KEYCODE_BACK

Botão Home

input keyevent KEYCODE_HOME

Alternar aplicativo

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