无影Android SDK是用于连接云电脑、云应用、云手机的无影Android端开放接口。通过集成Android SDK,您可以根据业务需求快速定制和搭建Android客户端。
1. 快速开始
1.1 获取SDK和DEMO
获取方式
下载和使用即表示您认可《无影云电脑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 对接流程
1.3 最佳实践
方案详见无影云手机快速集成最佳实践。 云手机集成的总体方案如下图所示
有多种登录方式,获取集成SDK所需要的连接云手机Ticket凭证,流程图为:
具体集成代码可以参考生命周期接口的参考代码。
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之间无缝切换显示。可按照如下步骤来实现:
参照2.1 定义并初始化StreamView
使用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);
将StreamView与IAspEngine绑定(该接口会将串流在当前View进行渲染)
mStreamView.bindASPEngine(engine);
恢复StreamView与IAspEngine绑定(该接口会让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是一个抽象类,它要求应用程序实现全局的初始化/销毁方法,并提供处理不同媒体数据的自定义实现:
其中:
IVideoStreamHandler接口定义了用于处理视频流数据的方法
IAdaptiveGraphicStreamHandler接口定义了用于处理自适应图片流数据的方法
IAudioPlaybackStreamHandler接口定义了用于处理音频下行数据的方法
ICursorBitmap接口定义了用于处理光标数据的方法
应用程序可自行选择实现上述接口中的一个或多个,无影SDK最终会根据应用程序提供的接口实现设置云上下发流的类型,规则如下:
若应用程序同时提供了IVideoStreamHandler及IAdaptiveGraphicStreamHandler的实现,则串流被设置为混合模式,无影将根据当前使用的场景自动在自适应图片流及视频流之间进行切换
若应用程序仅提供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;
}
在上面的例子中,自定义媒体引擎提供了IVideoStreamHandler及IAudioPlaybackStreamHandler的实现,onCreateXXXHandler方法在一次串流过程中只会被执行一次。
主要方法调用流程:
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
该接口定义了处理视频流数据的主要方法,其主要工作流程如下:
当应用发生前后台切换时,用于渲染的Surface将被销毁或重建,在这种情况下,IVideoStreamHandler.setVideoSurface将被多次调用,当Surface被销毁时,通过setVideoSurface传入的surface对象为null,应用程序需要处理好decoder及render的容错工作。
应用程序通过实现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
该接口定义了处理音频流数据的主要方法,其主要工作流程如下:
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
该接口定义了处理图像流数据的主要方法,其主要工作流程如下:
目前应用程序获取到的图片帧格式为位图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提供该接口的实现用于光标图像的绘制,其主要工作流程如下:
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. 错误代码
错误码 | 错误消息( | 定义模块 | 原因 |
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
暂不支持,客户有需要使用,可以将SDK的aar库上传自己的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 |