O AgentBay Android SDK conecta clientes Android ao smart sandbox do AgentBay. Integre o SDK para criar e personalizar clientes Android para o AgentBay.
1. Início rápido
1,1 Obter o SDK e a demonstração
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 autorizaçã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.gradledo 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
1,3 Melhores práticas
Consulte Melhores práticas para integração do Cloud Phone.
Vários métodos de logon estão disponíveis para obter o ticket de conexão necessário à integração do SDK.
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 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:
Defina e inicialize as instâncias
StreamViewconforme descrito na Seção 2,1.-
Utilize
IAspEnginepara estabelecer uma conexão. Os parâmetros devem ser consistentes com a definição deConfigna 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); -
Vincule o
IAspEnginea umStreamView. Esta chamada renderiza o stream naViewespecificada.mStreamView.bindASPEngine(engine); -
Retome a renderização em um
StreamView. Esta chamada instrui aViewa 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 é encerrada. 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 |
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 |
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 Definir este parâmetro como |
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, toda entrada de toque é convertida em eventos de mouse e enviada ao servidor. Para cloud phones, recomendamos definir isso como |
scaleStreamVideo(ScaleType scaleType) | Especifica o comportamento de dimensionamento para o stream de vídeo. Para valores válidos de |
setVideoProfile(int width, int height, int fps, IRemoteResult result) | Define a resolução para o stream de vídeo. O parâmetro |
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 |
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 |
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 do |
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 keyframe. |
Em 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 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 addLyncChannel(LyncChannel var1) e removeLyncChannel(LyncChannel var1) | Adiciona ou remove o canal para envio de comandos ADB. Para detalhes de implementação, consulte |
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 definir a taxa de quadros e a qualidade da imagem. O parâmetro O parâmetro |
Em registerIMEListener, unregisterIMEListener, setImeType, enableRelativeMouse, etc. | Não suportado em cloud phones. |
4. Parâmetros
4,1 Config
Use estes parâmetros para estabelecer uma conexão.
|
Parâmetro |
Tipo |
Descrição |
|
|
string |
O ID da instância. Este valor corresponde ao |
|
|
string |
O ticket de autenticação de conexão. Obtenha este ticket chamando a API |
|
|
boolean |
Habilita o canal RTC quando definido como |
|
|
boolean |
Habilita uma verificação de disponibilidade do VDAgent durante a conexão quando definido como |
|
|
boolean |
Defina como |
|
|
string |
O tipo de sistema operacional. Deve ser definido como |
4,2 StatisticsInfo
Dados de desempenho
|
API |
Tipo |
Descrição |
|
mReceiveFps |
int |
Taxa de quadros recebida |
|
mRenderFps |
int |
Taxa de quadros renderizada |
|
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 diferirem. |
5,1 SystemPermission
Especifica as permissões do sistema.
|
Parâmetro |
Descrição |
|
RECORDAUDIO |
Permite gravar áudio. |
6. Personalizando MediaStreamPlayer
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
Implementar com.aliyun.wuying.aspsdk.aspengine.MediaStreamPlayer permite que um aplicativo use um mecanismo de mídia personalizado para processar dados de mídia de streaming, que consistem principalmente em:
Dados de stream de vídeo: Um stream de vídeo bruto composto principalmente de quadros compactados H.264/H.265.
Stream de imagem adaptativo: Um stream de imagem consistindo principalmente de 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 renderizar 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, e forneçam uma implementação personalizada para lidar com diferentes tipos de dados de mídia:

Onde:
A interface
IVideoStreamHandlerserve para lidar com dados de stream de vídeo.A interface
IAdaptiveGraphicStreamHandlerserve para lidar com dados de stream gráfico adaptativo.A interface
IAudioPlaybackStreamHandlerserve para lidar com dados de reprodução de áudio.A interface
ICursorBitmapserve para lidar com dados de cursor.
Um aplicativo pode implementar uma ou mais das interfaces anteriores. O Alibaba Cloud Workspace SDK determina então 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á apenas 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á apenas 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:
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 |
|
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 |
|
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 |
|
6,2,4 onCreateVideoStreamHandler
Fornece uma implementação de mecanismo de mídia para lidar com 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 lidar com dados de stream de vídeo. Retorne null se o aplicativo não fornecer uma implementação. Neste 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 lidar com 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 lidar com dados de stream gráfico adaptativo. Se seu aplicativo não fornecer uma implementação, retorne |
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 |
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 |
6,3 IVideoStreamHandler
Esta interface fornece os métodos primários para lidar com streams de vídeo. O fluxo de trabalho principal é o seguinte:
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 lidar com 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 esta 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 |
|
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 Este valor pode ser |
Valor de retorno
|
Tipo |
Descrição |
|
ErrorCode |
|
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 |
|
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 |
|
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 |
|
6,3,7 getVideoTracks
Retorna informações sobre todos os streams de vídeo atualmente sendo processados.
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 sendo processados. |
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 |
|
6,4 IAudioPlaybackStreamHandler
Esta interface fornece métodos para lidar com dados de stream de áudio. O fluxo de trabalho é o seguinte:
6,4,1 initAudio
Chamado quando um canal de áudio é criado.
ErrorCode initAudio();
Valor de retorno
|
Tipo |
Descrição |
|
ErrorCode |
|
6,4,2 deInitAudio
Chamado quando um canal de áudio é destruído.
ErrorCode deInitAudio();
Retorno
|
Tipo |
Descrição |
|
ErrorCode |
|
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 |
|
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 |
|
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 |
|
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 |
Valor de retorno
|
Tipo |
Descrição |
|
ErrorCode |
|
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 |
Valor de retorno
|
Tipo |
Descrição |
|
ErrorCode |
|
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 |
|
6,5 IAdaptiveGraphicStreamHandler
Esta interface fornece métodos para processar dados de stream de imagem. O fluxo de trabalho é o seguinte:
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 Este objeto pode ser null quando o aplicativo entra em segundo plano ou a tela é bloqueada. |
Valor de retorno
|
Tipo |
Descrição |
|
ErrorCode |
|
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 |
|
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 |
|
6,6 ICursorBitmapHandler
Esta interface define os métodos primários para lidar com 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:
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 |
|
6,6,2 unsetCursorBitmap
Chamado quando o cursor no cloud phone é ocultado.
ErrorCode unsetCursorBitmap();
Valor de retorno
|
Tipo |
Descrição |
|
ErrorCode |
|
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 |
|
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 |
|
Códigos de erro
Código de erro | Mensagem de erro ( | Módulo | Causa |
Os códigos de erro 2–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 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 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 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 desconectado 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 é 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 parâmetros de conexão. | ASP SDK | Um parâmetro inválido foi passado ao conectar ao servidor. |
2027 | O modo de pull do stream foi alternado. | ASP SDK | O modo de pull do stream foi alternado de modo 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 é 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. | lado do aplicativo | |
2501 | O cliente falhou ao conectar ao gateway de stream. A rede está inacessível. | gateway de stream | |
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). | gateway de stream | |
2503 | O cliente falhou ao conectar ao gateway de stream devido a um erro de rede desconhecido. | gateway de stream | |
2504 | O cliente falhou ao conectar ao gateway de stream. A conexão foi abortada pelo software. | gateway de stream | |
2505 | O cliente falhou ao conectar ao gateway de stream. A conexão foi recusada. | gateway de stream | |
2506 | O ticket é inválido. O gateway falhou ao analisar o token. | gateway de stream | |
2507 | O ticket é inválido porque expirou. | gateway de stream | |
2508 | O ticket é inválido devido a uma incompatibilidade de UUID. | gateway de stream | |
2509 | O gateway de stream falhou ao sondar o servidor ASP. | gateway de stream | |
2510 | A sonda ao servidor foi rejeitada. Solução: Certifique-se de que o servidor esteja escutando na porta 5912. | gateway de stream | |
2511 | A sonda ao servidor falhou devido a um erro diferente de tempo limite ou recusa. | gateway de stream | |
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. | gateway de stream | |
2513 | A conexão TCP foi redefinida durante o handshake "SayHello" entre o cliente e o gateway de stream. | gateway de stream | |
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 falhas de reconexão 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 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. | lado do aplicativo | 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. | lado do aplicativo | 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. | lado do aplicativo | 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. | lado do aplicativo | |
8. Perguntas frequentes
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 comuns do ADB
|
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 |