Android SDK

无影Android SDK是用于连接云电脑、云应用、云手机的无影Android端开放接口。通过集成Android SDK,您可以根据业务需求快速定制和搭建Android客户端。

1. 快速开始

1.1 获取SDKDEMO

获取方式

说明

下载和使用即表示您认可《无影云电脑SDK隐私权政策》

本平台所有文档、SDK、客户端程序仅限于本人或本企业使用,未经阿里云同意不会转发给第三方个人或企业。

集成环境要求

最低支持Android版本:5.1

以集成AAR包方式接入SDK

  • aspengine-third-release.aar 拷贝到app/libs目录下。

  • 在应用模块的build.gradle加入:

dependencies {
    implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
    // aspengine-sdk依赖的ini配置解析库
    implementation 'org.ini4j:ini4j:0.5.4'
}
  • AndroidManifest 声明必要的权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE"/>

1.2 对接流程

image

1.3 最佳实践

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

image

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

image

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

2. 生命周期接口

2.1 初始化创建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 建立连接

mConfigs取值参考4.1 Config

mStreamView.start(mConfigs);

2.3 断开连接

mStreamView.stop();

2.4 销毁实例StreamView

mStreamView.dispose();
mStreamView = null;

2.5 多StreamView模式

此模式支持一个串流在多个View之间无缝切换显示。可按照如下步骤来实现:

  1. 参照2.1 定义并初始化StreamView

  2. 使用IAspEngine来建立连接,参数与4.1 Config定义一致

    IASPEngine engine = mBuilder.enableRTC(true).build(context);
    //开启数据统计
    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. StreamViewIAspEngine绑定(该接口会将串流在当前View进行渲染)

    mStreamView.bindASPEngine(engine);
  4. 恢复StreamViewIAspEngine绑定(该接口会让View重新接管串流进行渲染)

    mStreamView.resumeASPEngine();

更多细节请参考DEMO的实现。

2.6 回调说明

连接回调代理IASPEngineListener

代理接口说明:

接口

描述

onConnectionSuccess(int connectionId)

连接云手机成功回调,返回连接的标识

onConnectionFailure(int errorCode, String errorMsg)

连接云手机失败回调,返回错误码和错误信息

onEngineError(int errorCode, String errorMsg)

SDK内部发生异常回调,返回错误码和错误信息

onDisconnected(int reason)

云手机连接被断开,返回被断开原因

onReconnect(int errorCode)

云手机连接发生重连动作,返回导致重连的错误码

onFirstFrameRendered(long timeCostMS)

云手机显示第一帧画面回调,返回耗时情况

onPolicyUpdate(String policy)

云手机策略回调,返回策略配置

onSessionSuccess()

云手机连接会话创建成功回调

性能数据回调代理IStatisticsListener

代理接口说明:

接口

描述

onStatisticsInfoUpdate(StatisticsInfo statisticsInfo)

云手机性能数据回调,返回性能数据对象

申请系统权限回调代理IRequestSystemPermissionListener

代理接口说明:

接口

描述

bool OnRequestSystemPermission(SystemPermission permission)

申请系统权限回调,返回申请系统权限类型

注册与反注册回调代码示例:

//监听连接回调
mStreamView.getASPEngineDelegate().registerASPEngineListener(IASPEngineListener var1);
mStreamView.getASPEngineDelegate().unregisterASPEngineListener(IASPEngineListener var1);
//监听性能数据回调
mStreamView.getASPEngineDelegate().registerStatisticsListener(IStatisticsListener var1);
mStreamView.getASPEngineDelegate().unregisterStatisticsListener(IStatisticsListener var1);
//监听申请系统权限
mStreamView.registerSystemPermissionListener(IRequestSystemPermissionListener listener);
mStreamView.unregisterSystemPermissionListener(IRequestSystemPermissionListener listener);

3. 业务接口

接口

说明

enableVDAgentCheck(boolean enabled)

建连时是否强制检查VDAgent的可用性,默认是进行检查。

当该值设置为True时,若在建连时发现VDAgent不可用,则会报错并断开当前连接。

不建议设置为false,通常只有在进行内部调试时才会这么做。

enableRTC(boolean enabled)

设置是否使用RTC传输流化数据内容,默认使用RTC传输流化数据内容

enableDesktopMode(boolean enabled)

设置是否以桌面模式运行,设置为enabled后,会将所有Touch消息转换为Mouse事件向服务端发送。云手机建议设置为false

scaleStreamVideo(ScaleType scaleType)

指定对流化图像内容进行相应的缩放处理,ScaleType取值参考枚举类型5.1 ScaleType

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

设置视频流的分辨率及帧率,帧率暂不支持

boolean sendKeyEvent(KeyEvent event)

sendKeyboardEvent(KeyEvent event, IRemoteResult result)

向云上发送键盘按键消息

boolean simulateMouseClick(boolean leftButton)

模拟向云上发送鼠标点击事件,参数true表示模拟鼠标左键点击事件,false表示模拟鼠标右键点击事件

boolean enableMouseMode(boolean enabled)

激活或关闭鼠标模式

boolean sendMouseEvent(MotionEvent motionEvent)

sendMouseEvent(MotionEvent motionEvent, IRemoteResult result)

向云上发送鼠标按键消息

reconnect(String connectionToken)

发生连接异常断开时,可通过该接口执行重连动作。

通常针对disconnect reason=2200执行该动作,应用程序需要通过OpenAPI重新获取连接云手机的token并交给重连接口执行重连动作。

boolean setMediaStreamPlayer(MediaStreamPlayer player)

使用应用自定义的媒体引擎替换SDK中默认的媒体引擎实现,该方法只能在发起串流之前,或串流断开之后调用。

void setAlignStreamResolutionWithSurfaceSize(boolean aligned)

设置是否在串流开始时,自动将流分辨率同步为端侧用于渲染图像的SurfaceView的大小,默认开启该功能。云手机建议关闭。

void mute(boolean muted)

设置是否进入静音模式。

void enableStatistics(boolean enabled)

是否开启性能数据统计

mStreamView.getASPEngineDelegate().requestIFrame()

请求关键帧

mStreamView.getASPEngineDelegate()下的

registerFileTransferListener(IFileTransferListener var1)

unregisterFileTransferListener(IFileTransferListener var1)

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

文件上传和下载,demo也有对应的实现

mStreamView.getASPEngineDelegate()下的

addDataChannel(DataChannel var1)

removeDataChannel(DataChannel var1)

与镜像接发自定义数据通道,demo也有对应的实现

mStreamView.getASPEngineDelegate()下的

addLyncChannel(LyncChannel var1)

removeLyncChannel(LyncChannel var1)

adb发送命令通道,实现参考demo里的AspAdbUtil

void setToQualityFirst()

设置画质优先模式,该模式下所支持的最高帧率为 30 FPS,最高画质为优质。云手机暂不支持。

void setToFpsFirst()

设置流畅优先模式,该模式下所支持最高帧率为 60 FPS,最高画质为良好。云手机暂不支持。

void setToCustomPicture(int fps, int quality);

用户自定义模式,用户可以自定义帧率和画质。

参数 fps 值为 0 到 60 区间,代表帧率设置,值越高越流畅。

参数 quality 值为 0 到 4 区间,0:无损,1:优质 2:良好 3:一般 4:自动。云手机暂不支持。

mStreamView.getASPEngineDelegate()下的

registerIMEListener、unregisterIMEListener、setImeType、enableRelativeMouse

云手机暂不支持。

4. 参数详细说明

4.1 Config

建立连接的配置参数。

配置Key

取值的类型

配置说明

StreamView.CONFIG_DESKTOP_ID

string

实例ID,DescribeUserResources API返回的ResourceId。

StreamView.CONFIG_CONNECTION_TICKET

string

连接鉴权Ticket,通过GetConnectionTicket API获取。

StreamView.CONFIG_PREFER_RTC_TRANSPORT

boolean

使用RTC通道,云手机推荐true。

StreamView.CONFIG_ENABLE_VDAGENT_CHECK

boolean

是否在建连过程中检查VDAgent可用性,云手机推荐true。

StreamView.CONFIG_ENABLE_STATISTICS

boolean

是否激活性能统计,若激活,将在视频流上额外呈现性能数据,云手机推荐true。

OSType

string

云手机取值为android

4.2 StatisticsInfo

性能数据

接口

类型

说明

mReceiveFps

int

接收到的帧率

mRenderFps

int

渲染帧率

mDownstreamBandwithMBPerSecond

double

下行带宽

mUpstreamBandwithMBPerSecond

double

上行带宽

mP2pFullLinkageLatencyMS

long

端到端全链路时延,已废弃

mNetworkLatencyMS

long

网络rtt时延

mPingGatewayRttMS

long

ping rtt时延

mLostRate

double

丢包率

mServerRenderLatencyMS

long

云侧渲染延迟

mServerEncoderLatencyMS

long

云侧编码延迟

mServerTotalLatencyMS

long

云侧总延迟

mTotalDownstreamBandwidth

long

总带宽

mGuestCpuUsage

long

镜像CPU使用率

mStreamType

String

流协议类型

5. 枚举类型

5.1 ScaleType

流化图像内容缩放处理类型。

名称

含义

FILL_STREAM_VIEW

总是将流化图像拉伸至与StreamView相同大小。当StreamView的长宽比例与流化图像长宽比例不相等时。采用该策略可能导致图像有明显的变形 

FIT_STREAM_CONTENT

StreamView的渲染区域进行调整,使得StreamView总是能以相同的长宽比例渲染流化图像内容。采用该策略时,流化图像可能无法填满整个StreamView

5.1 SystemPermission

系统权限类型

名称

含义

RECORDAUDIO

请求录音权限

6. 自定义MediaStreamPlayer

说明

若没有自定义多媒体的诉求,可忽略,SDK有默认多媒体实现。

6.1 使用自定义媒体引擎处理媒体数据

通过实现com.aliyun.wuying.aspsdk.aspengine.MediaStreamPlayer,应用程序可使用自定义的媒体引擎处理串流媒体数据,这些数据主要包括:

  • 视频流数据 - 以H264/H265压缩帧为主的视频裸流

  • 自适应图片流数据 - 以位图为主的图像流

  • 音频下行数据 - 以Opus/PCM为主的音频下行数据流

  • 光标数据 - 启用虚拟鼠标模式时,应用程序可接收到光标图像及位置数据,应用程序可使用这些数据自行绘制虚拟光标

应用程序可以通过调用IASPEngine.setMediaStreamPlayer接口向无影SDK提供自定义的媒体引擎实现。

6.2 MediaStreamPlayer

MediaStreamPlayer是一个抽象类,它要求应用程序实现全局的初始化/销毁方法,并提供处理不同媒体数据的自定义实现:

image.png

其中:

  • IVideoStreamHandler接口定义了用于处理视频流数据的方法

  • IAdaptiveGraphicStreamHandler接口定义了用于处理自适应图片流数据的方法

  • IAudioPlaybackStreamHandler接口定义了用于处理音频下行数据的方法

  • ICursorBitmap接口定义了用于处理光标数据的方法

应用程序可自行选择实现上述接口中的一个或多个,无影SDK最终会根据应用程序提供的接口实现设置云上下发流的类型,规则如下:

  • 若应用程序同时提供了IVideoStreamHandlerIAdaptiveGraphicStreamHandler的实现,则串流被设置为混合模式,无影将根据当前使用的场景自动在自适应图片流及视频流之间进行切换

  • 若应用程序仅提供IVideoStreamHandler的实现,则串流将被设置为Video stream only,此时服务端只会提供视频流数据

  • 若应用程序仅提供IAudioPlaybackStreamHandler的实现,则串流将被设置为Image stream only,此时服务端只会提供图片流数据

应用程序可通过实现MediaStreamPlayer的一系列onCreateXXXHandler方法向SDK提供针对不同媒体数据的自定义实现:

    @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;
    }

在上面的例子中,自定义媒体引擎提供了IVideoStreamHandlerIAudioPlaybackStreamHandler的实现,onCreateXXXHandler方法在一次串流过程中只会被执行一次。

主要方法调用流程:

image

6.2.1 initialize

由应用程序实现该方法,可用于执行自定义媒体引擎相关的全局初始化动作。

该方法在每次串流过程中将被执行一次。

public ErrorCode initialize()

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行初始化成功,否则表示初始化失败

6.2.2 release

由应用程序实现该方法,可用于执行自定义媒体引擎相关的全局释放动作。

该方法在每次串流过程中将被执行一次。

public ErrorCode release()

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行释放成功,否则表示释放失败

6.2.3 enableStatistics

由应用程序实现该方法,可用于激活/关闭性能统计数据采集。

public void enableStatistics(boolean enabled)

参数:

参数

类型

说明

enabled

boolean

True表明开启性能数据采集。

False关闭性能数据采集。

6.2.4 onCreateVideoStreamHandler

由应用程序实现该方法,用于向SDK提供处理视频流数据的媒体引擎实现。

该方法在每次串流过程中将被执行一次。

public IVideoStreamHandler onCreateVideoStreamHandler()

返回值:

类型

说明

IVideoStreamHandler

由应用程序提供的用于处理视频流数据的媒体引擎实现。

若应用不提供视频流处理实现,则返回null,在这种情况下视频流数据不会得到任何处理。

6.2.5 onCreateAdaptiveGraphicStreamHandler

由应用程序实现该方法,用于向SDK提供处理自适应图片流数据的媒体引擎实现。

该方法在每次串流过程中将被执行一次。

public IAdaptiveGraphicStreamHandler onCreatAdaptiveGraphicStreamHandler()

返回值:

类型

说明

IAdaptiveGraphicStreamHandler

由应用程序提供的用于处理自适应图片流数据的媒体引擎实现。

若应用不提供自适应图片流处理实现,则返回null,在这种情况下,图片流数据不会得到任何处理。

6.2.6 onCreateAudioPlaybackStreamHandler

由应用程序实现该方法,用于向SDK提供处理音频下行数据的媒体引擎实现。

该方法在每次串流过程中将被执行一次。

public IAudioPlaybackStreamHandler onCreatAudioPlaybackStreamHandler()

返回值:

类型

说明

IAudioPlaybackStreamHandler

由应用程序提供的用于处理音频下行数据的媒体引擎实现。

若应用不提供音频下行数据处理实现,则返回null,在这种情况下音频下行数据不会得到任何处理。

6.2.7 onCreateCursorBitmapHandler

由应用程序实现该方法,用于向SDK提供处理光标数据的媒体引擎实现。

该方法在每次串流过程中将被执行一次。

通过该方法提供的接口实现仅在虚拟鼠标模式激活时被使用。

public ICursorBitmapHandler onCreatCursorBitmapHandler()

返回值:

类型

说明

ICursorBitmapHandler

由应用程序提供的用于处理光标数据的媒体引擎实现。

若应用不提供光标数据处理实现,则返回null,在这种情况下,即使虚拟鼠标模式被激活,光标位置数据也不会得到任何处理。

6.3 IVideoStreamHandler

该接口定义了处理视频流数据的主要方法,其主要工作流程如下:

image

当应用发生前后台切换时,用于渲染的Surface将被销毁或重建,在这种情况下,IVideoStreamHandler.setVideoSurface将被多次调用,当Surface被销毁时,通过setVideoSurface传入的surface对象为null,应用程序需要处理好decoderrender的容错工作。

应用程序通过实现IVideoStreamHandler.setEventHandler方法可获取无影SDK提供的事件处理接口,通过该接口,应用程序可以将自定义媒体引擎内的一些视频处理事件通知给无影SDK内部,目前主要用于性能数据统计:

    @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;
            // 通知无影SDK一帧视频图像完成渲染,SDK内部根据frameId计算端侧全链路时延
            mHandler.callback(event);
        }
    }

6.3.1 setEventHandler

由应用程序实现该方法,当自定义媒体引擎被无影SDK加载时,SDK通过该方法向应用程序提供EventHandler,应用程序可通过该handler发送视频流处理事件。

public void setEventHandler(EventHandler handler)

参数:

参数

类型

说明

handler

EventHandler

由无影SDK提供的handler对象,应用程序通过该对象向SDK发送视频流处理事件

6.3.2 addVideoTrack

由应用程序实现该方法,当一路视频流创建时,通过该方法通知应用程序。

目前一次串流过程中最多只存在一路视频。

ErrorCode addVideoTrack(int trackId, VProfile profile);

参数:

参数

类型

说明

trackId

int

视频流Id

profile

VProfile

视频流信息

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.3.3 setVideoSurface

由应用程序实现该方法,当用于渲染视频的Surface状态发生变化时,通过该方法通知应用程序。

ErrorCode setVideoSurface(int trackId, Surface surface);

参数:

参数

类型

说明

trackId

int

视频流Id

surface

android.view.Surface

用于渲染视频的Surface对象。

当应用切换到后台或发生锁屏动作时,该对象可能为null

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.3.4 playVideo

由应用程序实现该方法,当用视频流准备就绪时,通过该方法通知应用程序。

ErrorCode playVideo(int trackId);

参数:

参数

类型

说明

trackId

int

视频流Id

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.3.5 removeVideoTrack

由应用程序实现该方法,当视频流被销毁时,通过该方法通知应用程序。

ErrorCode removeVideoTrack(int trackId);

参数:

参数

类型

说明

trackId

int

视频流Id

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.3.6 pushVideoFrame

由应用程序实现该方法,当用于接收到新的视频帧时,通过该方法通知应用程序。

ErrorCode setVideoSurface(int trackId, Surface surface);

参数:

参数

类型

说明

trackId

int

视频流Id

frame

VFrame

新接收到的视频帧信息

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.3.7 getVideoTracks

由应用程序实现该方法,SDK通过该方法从应用程序获取当前正在处理所有视频流信息。

HashMap<Integer, VProfile> getVideoTracks();

返回值:

类型

说明

HashMap<Integer, VProfile>

应用程序获取当前正在处理所有视频流信息

6.3.8 release

由应用程序实现该方法,当所有的视频流被销毁时,通过该方法通知应用程序执行清理动作。

ErrorCode release();

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.4 IAudioPlaybackStreamHandler

该接口定义了处理音频流数据的主要方法,其主要工作流程如下:

image

6.4.1 initAudio

由应用程序实现该方法,当SDK内的音频通道创建时,通过该方法通知应用程序。

ErrorCode initAudio();

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.4.2 deInitAudio

由应用程序实现该方法,当SDK内的音频通道被销毁时,通过该方法通知应用程序。

ErrorCode deInitAudio();

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.4.3 startAudioPlayback

由应用程序实现该方法,当云手机将要开始下发音频流时,通过该方法通知应用程序。

ErrorCode startAudioPlayback();

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.4.4 stopAudioPlayback

由应用程序实现该方法,当云手机停止下发音频流时,通过该方法通知应用程序。

ErrorCode stopAudioPlayback();

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.4.5 pushAudioPlaybackFrame

由应用程序实现该方法,当接收到新的下行音频帧时,通过该方法通知应用程序。

ErrorCode pushAudioPlaybackFrame(AFrame pbData);

参数:

参数

类型

说明

pbData

AFrame

新接收到的音频帧信息

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.4.6 updateAudioPlaybackVol

由应用程序实现该方法,当云手机里的系统音量大小发生变化时,通过该方法通知应用程序。

ErrorCode updateAudioPlaybackVol(int volume);

参数:

参数

类型

说明

volume

int

云手机里的系统音量值,最大值为USHRT_MAX,0表示静音。

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.4.7 updateAudioPlaybackMute

由应用程序实现该方法,当云手机被静音/解除静音时,通过该方法通知应用程序。

ErrorCode updateAudioPlaybackMute(int mute);

参数:

参数

类型

说明

mute

int

1表示云手机进入静音状态,0表示解除静音

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.4.8 release

由应用程序实现该方法,当音频通道被销毁时,通过该方法通知应用程序执行清理动作。

ErrorCode release();

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.5 IAdaptiveGraphicStreamHandler

该接口定义了处理图像流数据的主要方法,其主要工作流程如下:

image

目前应用程序获取到的图片帧格式为位图ARGB8888。

一次串流过程中最多存在一个图片流。

6.5.1 setAdaptiveGraphicSurface

由应用程序实现该方法,当用于渲染图片的Surface状态发生变化时,通过该方法通知应用程序

ErrorCode setAdaptiveGraphicSurface(Surface surface);

参数:

参数

类型

说明

surface

android.view.Surface

用于渲染图片的Surface对象。

当应用切换到后台或发生锁屏动作时,该对象可能为null

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.5.2 invalidateAdaptiveGraphicSurface

由应用程序实现该方法,当用于接收到新的图片帧数据时,通过该方法通知应用程序

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

参数:

参数

类型

说明

region

Region

图片帧绘制区域信息

buffer

byte[]

图片帧数据

format

BitmapFormat

图片帧格式信息,默认为ARGB8888

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.5.3 release

由应用程序实现该方法,当图片流被销毁时,通过该方法通知应用程序执行清理动作。

ErrorCode release();

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.6 ICursorBitmapHandler

该接口定义了处理光标数据的主要方法,在虚拟鼠标模式激活时,应用程序向SDK提供该接口的实现用于光标图像的绘制,其主要工作流程如下:

image

6.6.1 setCursorBitmap

由应用程序实现该方法,当云手机里的光标形状发生变化时,通过该方法通知应用程序。

ErrorCode setCursorBitmap(CursorBitmap bitmap);

参数:

参数

类型

说明

bitmap

CursorBitmap

云手机光标图形数据

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.6.2 unsetCursorBitmap

由应用程序实现该方法,当云手机里的光标被隐藏时,通过该方法通知应用程序。

ErrorCode unsetCursorBitmap();

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.6.3 setCursorPosition

由应用程序实现该方法,当云手机里的光标形状生变化时,通过该方法通知应用程序。

ErrorCode setCursorPosition(float x, float y);

参数:

参数

类型

说明

x

float

光标的X坐标

y

float

光标的Y坐标

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

6.6.4 release

由应用程序实现该方法,当连接断开,取消光标显示时,通过该方法通知应用程序执行清理动作。

ErrorCode release();

返回值:

类型

说明

ErrorCode

ErrorCode.OK表明执行成功,否则表示失败

7. 错误代码

错误码

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

定义模块

原因

2~26主要是网络相关问题

2

连接%s失败

ASP SDK

无效MAGIC

3

连接%s失败

ASP SDK

数据有误

4

客户端与服务端版本不匹配

ASP SDK

版本不匹配

5

连接需要 TLS

ASP SDK

需要TLS

6

连接不需要 TLS

ASP SDK

不需要TLS而实际使用了TLS

7

您没有权限连接当前%s

ASP SDK

权限问题

8

ASP SDK

迁移过程中client ID无效

9

连接%s失败

ASP SDK

channel不存在

20

连接ASP服务器失败。

ASP SDK

channel 连接错误

21

TLS认证出错了

ASP SDK

TLS 认证错误

22

连接%s失败

ASP SDK

channel link 错误

23

连接%s失败

ASP SDK

连接认证错误

24

连接%s失败

ASP SDK

连接IO错误

25

连接%s失败

ASP SDK

Ticket校验失败。用户连接被断开后,若使用同一个Ticket再次请求建连,也将触发此错误。

26

ASP SDK

xquic 握手失败

连接中断开或遇到某些错误的情况

2000

获取%s数据超时,与服务端断开连接

ASP SDK

正常断开

2001

%s已与服务端断开连接。可能是因为%s进程已被强制终止。

ASP SDK

一般是端上应用被终止进程了,如Android应用用户通过按下Home键终止

2002

已有用户从其他终端连接当前%s。请稍后重试。

ASP SDK

其他人抢占了端

2003

%s正在关机或重启,一般由管理员操作,请稍后重试。

ASP SDK

云手机被关机或重启,一般是管理员操作

2004

当前用户连接被断开。

ASP SDK

客户端发起断流,或服务端发起踢人或断流

2005

%s已超时断开连接,因为已达到管理员设置的使用时长限制。

ASP SDK

管理员设置使用时长被关

2010

连接%s失败

ASP SDK

Vdagent连接失败

2011

连接参数传递错误。

ASP SDK

连接server参数传递错误

2027

拉流模式已切换。

ASP SDK

拉流模式由抢占模式切换为协同模式,或由协同模式切换为抢占模式

2100

剪切板权限,禁止从%s到本地

ASP SDK

剪贴板权限,禁止从VM到本地

2101

剪切板权限,禁止从本地到%s

ASP SDK

剪贴板权限,禁止从本地到 VM

2200

%s正在尝试重连...

ASP SDK

因为网络问题断开了,ASP SDK正在重连

2201

您的设备出现网络异常,导致%s已断开连接。

ASP SDK

因为网络问题断开了,ASP SDK因为镜像原因不支持重连,应用侧开始重连

2202

%s重连超时,请检查设备网络后重试。

ASP SDK

ASP SDK重连超时

端侧逻辑错误

5100

%s连接ASP Server超时,请稍后重试。

应用侧

端侧在一段时间内未接收到connected事件

5102

获取%s数据超时,请稍后重试。

应用侧

端侧在一段时间内接收到了connected但未接收到display事件

5004

客户端出现错误,请重新打开

应用侧

传入端侧启动参数有误,一般出现在开发阶段

5200

客户端重连超时,请稍后重试。

应用侧

8. 常见问题

怎么重启云手机

调用管控重启API RebootAndroidInstancesInGroup - 重启实例 进行重启,调用重启API后,端侧连接的云手机会断开,重启完成后,端侧再连接云手机。

对外Maven

暂不支持,客户有需要使用,可以将SDKaar库上传自己的Maven仓库进行使用。

常用ADB命令

功能

命令

返回键

input keyevent KEYCODE_BACK

Home

input keyevent KEYCODE_HOME

切换键

input keyevent KEYCODE_APP_SWITCH

静音

input keyevent 164

音量增大

input keyevent KEYCODE_VOLUME_UP

音量减小

input keyevent KEYCODE_VOLUME_DOWN

隐藏导航栏

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

显示导航栏

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

截图

screencap -p /sdcard/Download/abc.png