接口概览
顶层接口
通过
TcrSdk
对象调用的接口。方法 | 描述 |
初始化 SDK,初始化成功后才能使用其他接口。 | |
创建会话对象 TcrSession,用于和云手机进行交互。 | |
创建渲染视图 TcrRenderView,用于显示云手机画面和视图交互。 | |
获取安卓实例对象 AndroidInstance,用于操作云手机安卓实例。 |
会话接口
通过
TcrSession
对象调用的接口。生命周期相关接口
方法 | 描述 |
启动会话,在本地会话对象初始化成功后,调用此方法,以建立和指定 ID 的云手机的连接。在成功建立连接后,此会话对象才能与指定的云手机进行交互。 | |
释放会话,客户端释放本地会话资源。云端会在自动检测到心跳消失后释放云端资源。 | |
获取会话请求 ID。 |
音视频流控制接口
方法 | 描述 |
开关音频播放。 | |
开关音频上行。 | |
开关视频上行。 | |
暂停音视频流下行。 | |
恢复音视频流下行。 | |
设置下行的音频的参数。 | |
设置上行的视频的参数。 | |
设置下行视频的接收器。 | |
设置下行音频的接收器。 |
云端应用交互接口
方法 | 描述 |
重启云端应用进程。 | |
向云端应用输入框粘贴文本(需输入框已聚焦)。 | |
禁用云端软键盘(仅支持移动端应用)。 |
云端外设交互接口
方法 | 描述 |
获取云端触摸屏交互对象 TouchScreen。 |
触摸屏交互接口
通过
TouchScreen
对象调用的接口。方法 | 描述 |
触发云端触屏触摸事件。 |
安卓实例操作接口
通过
AndroidInstance
对象调用的接口。单实例操作接口
方法 | 描述 |
获取实例截图地址。 | |
获取实例截图。 | |
上传文件到实例。 | |
上传媒体文件到实例。 | |
获取文件下载地址。 | |
获取日志文件下载地址。 | |
下载文件。 | |
切换输入法。 |
多实例批量操作接口
方法 | 描述 |
设置设备 GPS 信息,支持批量实例操作。 | |
设置设备分辨率,支持批量实例操作。 | |
粘贴文本,支持批量实例操作。 | |
发送文本到剪切板,支持批量实例操作。 | |
摇一摇,支持批量实例操作。 | |
设置设备传感器信息,支持批量实例操作。 | |
发送 App binder 消息,支持批量实例操作。 | |
查询实例属性,支持批量实例操作。 | |
修改实例属性,支持批量实例操作。 | |
查询已安装第三方应用,支持批量实例操作。 | |
修改前台应用保活状态,支持批量实例操作。 | |
查询前台应用保活状态,支持批量实例操作。 | |
卸载应用,支持批量实例操作。 | |
启动应用,支持批量实例操作。 | |
停止应用,支持批量实例操作。 | |
清除应用数据,支持批量实例操作。 | |
启用应用,支持批量实例操作。 | |
禁用应用,支持批量实例操作。 | |
摄像头播放媒体文件,支持批量实例操作。 | |
摄像头停止播放媒体文件,支持批量实例操作。 | |
查询当前摄像头媒体播放状态,支持批量实例操作。 | |
摄像头显示图片,支持批量实例操作。 | |
增加后台保活应用,支持批量实例操作。 | |
移除后台保活应用,支持批量实例操作。 | |
覆盖后台保活应用,支持批量实例操作。 | |
查询后台保活应用,支持批量实例操作。 | |
清空后台保活应用,支持批量实例操作。 | |
静音开关,支持批量实例操作。 | |
搜索媒体库文件,支持批量实例操作。 | |
重启实例,支持批量实例操作。 | |
查询所有应用列表,支持批量实例操作。 | |
关闭应用至后台,支持批量实例操作。 | |
新增应用安装黑名单,支持批量实例操作。 | |
移除应用安装黑名单,支持批量实例操作。 | |
覆盖应用安装黑名单,支持批量实例操作。 | |
查询应用安装黑名单,支持批量实例操作。 | |
清空应用安装黑名单,支持批量实例操作。 | |
获取系统导航栏显示状态,支持批量实例操作。 | |
获取系统媒体音量大小,支持批量实例操作。 |
接口详细说明
初始化 SDK
初始化(init)云手机 SDK,初始化成功后才能使用 SDK 的其他接口。
输入参数
TcrConfig
参数名称 | 必选 | 类型 | 描述 |
type | 是 | SdkType | SDK 类型,云手机请设置为 CloudPhone。 |
ctx | 是 | Context | 当前应用的 Android Context。 |
logger | 是 | TcrLogger | 用于接收 SDK 日志的对象,App 需要将收到的 SDK 日志存储到文件和上报,以便分析定位 SDK 运行时的问题。 如果 App 没有显示设置 logger,SDK 会将日志打印到系统 logcat 以及写入日志文件(/storage/emulated/0/Android/data/app package name/files/tcrlogs 目录下)。 注意,当您反馈 SDK 问题时,您需要提供相应的日志。 |
callback | 是 | AsyncCallback | 初始化的异步回调对象。必须在回调成功后才能使用 SDK 的其他接口。 |
accessInfo | 否 | Boolean | |
token | 否 | Boolean |
示例
TcrSdk.TcrConfig config = new TcrSdk.TcrConfig();config.type = SdkType.CloudPhone;config.ctx = this;config.logger = new TcrLogger() {// 实现日志记录逻辑};config.callback = new AsyncCallback<Void>() {……};config.accessInfo = ……;config.token = ……;TcrSdk.getInstance().init(config);
创建会话
创建会话(createTcrSession)对象,用于和云手机进行交互。
会话对象创建后,SDK 内部会异步执行会话的本地初始化逻辑,初始化结果会通知给 builder 传入的参数 TcrSession#Observer 对象的 onEvent() 方法 。成功的通知事件为 TcrSession.Event#STATE_INITED,失败的通知事件为 TcrSession.Event#STATE_CLOSED。使用者只有在收到会话初始化成功的事件之后,才能进一步调用 access() 方法与云手机进行建连。
输入参数
返回值
创建的会话对象。如果为 null 则代表对象创建失败(通常是因 SDK 状态异常,例如未初始化成功)。
注意:
只有成功创建了会话对象,内部才会执行会话的本地初始化逻辑,才可能进一步收到 observer 的回调事件。
示例
// Tcr会话的观察者,处理各类事件通知的消息和数据private final Observer mSessionObserver = new Observer() {@Overridepublic void onEvent(TcrSession.Event event, Object eventData) {switch (event) {case STATE_INITED:// 本地会话对象初始化完成// 可以开始连接指定的云手机。boolean ret = mTcrSession.access(mGroupInstanceIds, mIsGroup);if (!ret) {showToast("连接云手机失败,请重试", Toast.LENGTH_SHORT);finish();}break;case STATE_CONNECTED:// 成功和指定的云手机建立连接// 设置云手机的主控、同步列表、请求主控视频流if (mIsGroup) {String masterId = mGroupInstanceIds.get(0);TcrSdk.getInstance().getAndroidInstance().setMaster(masterId);TcrSdk.getInstance().getAndroidInstance().setSyncList(mGroupInstanceIds);TcrSdk.getInstance().getAndroidInstance().requestStream(masterId, "open", "low");}break;case STATE_CLOSED:showToast("会话关闭", Toast.LENGTH_SHORT);finish();break;}}};// 创建Tcr会话对象private void initTcrSession() {TcrSessionConfig tcrSessionConfig = TcrSessionConfig.builder().observer(mSessionObserver).build();mTcrSession = TcrSdk.getInstance().createTcrSession(tcrSessionConfig);if (mTcrSession == null) {Log.e(TAG, "mTcrSession = null");showToast("创建会话失败,请检查TcrSdk是否初始化成功", Toast.LENGTH_SHORT);}}
创建渲染视图
创建渲染视图(createTcrRenderView)对象,用于 UI 上显示云手机画面和视图交互。
输入参数
参数名称 | 必选 | 类型 | 描述 |
context | 是 | Context | 视图的 Android Context。 |
session | 是 | TcrSession | 视图关联的会话对象。 |
type | 是 | TcrRenderViewType | 视图类型。 |
示例
// 创建渲染视图mRenderView = TcrSdk.getInstance().createTcrRenderView(PlayActivity.this, mTcrSession, TcrRenderViewType.SURFACE);if (mRenderView == null) {Log.e(TAG, "createTcrRenderView 失败");return;}// 将渲染视图添加到界面上((FrameLayout) findViewById(R.id.render_view_parent)).addView(mRenderView);
设置 AccessToken
设置 accessToken(setAccessToken)。
输入参数
获取安卓实例
获取安卓实例对象(getAndroidInstance),用于操作云手机安卓实例。
AndroidInstance androidInstance = TcrSdk.getInstance().getAndroidInstance();
启动会话
启动会话(access),建立与云手机的连接。在本地会话对象初始化成功后(参见 创建会话),调用此方法以建立和指定 ID 的云手机的连接。在调用此方法之前,需要在 init() 方法的 TcrConfig 内传入正确的 accessToken 或者调用了 setAccessToken()。
建连的结果会异步回调给 TcrSession#Observer#onEvent() 方法,成功事件为 TcrSession.Event#STATE_CONNECTED ,失败事件为 TcrSession.Event#STATE_CLOSED。使用者只有在收到成功建立连接的事件后,才能使用此会话对象与指定的云手机进行交互。
输入参数
参数名称 | 必选 | 类型 | 描述 |
instanceIds | 是 | ArrayList<String> | 此会话要控制的实例 ID 列表。如果 isGroupControl 为 false,则只会取列表里的第一个元素。 |
返回值
连接请求是否成功发起(注意:实际连接结果异步回调返回)。
返回 true:已成功发起连接请求。
返回 false:请求发送失败(通常因参数无效或会话状态异常)。
示例
释放会话
释放会话(release),客户端释放本地会话资源。云端会在自动检测到心跳消失后释放云端资源。
示例
mTcrSession.release();
获取会话请求 ID
获取当前会话的请求 ID(getRequestId),用于和 SDK 后台排查问题。
示例
mTcrSession.getRequestId();
开关音频播放
setEnableAudioPlaying
输入参数
enable:true 为启用音频播放,false 为禁用。
返回值
无
调用示例
开关音频上行
启用或禁用从麦克风捕获的本地音轨。启用后,本地捕获的音频会上行至云端。
输入参数
enableLocalAudio:true 为启用,false 为禁用。
返回值
无
调用示例
开关视频上行
setEnableLocalAudio
启用或禁用从摄像头捕获的本地视频。启用后,本地捕获的视频画面会上行至云端。
输入参数
enableLocalVideo:true 为启用,false 为禁用。
返回值
无
调用示例
暂停音视频流下行
pauseStreaming
调用示例
恢复音视频流下行
resumeStreaming
调用示例
设置上行的视频的参数
setLocalVideoProfile
配置本地上行的视频的参数(分辨率、帧率、码率、摄像头方向)。
输入参数
参数名称 | 必选 | 类型 | 描述 |
width | 是 | int | 视频宽度。 |
height | 是 | int | 视频高度。 |
fps | 是 | int | 帧率。 |
minBitrate | 是 | int | 最小比特率。 |
maxBitrate | 是 | int | 最大比特率。 |
isFrontCamera | 是 | BOOL | 是否为前置摄像头。 |
返回值
无
调用示例
设置下行的音频的参数
设置远端下行的音频的音量参数(setRemoteAudioPlayProfile)。
输入参数
参数名称 | 必选 | 类型 | 描述 |
volume | 是 | float | 音量系数,取值 [0,10]。 |
返回值
无
调用示例
设置下行视频的接收器
setVideoSink
设置视频渲染目标。SDK 将解码后的视频帧回调到 videoSink,用于后处理或渲染。
输入参数
videoSink:视频接收器,传 null 可移除现有目标。
返回值
无
调用示例
设置下行音频的接收器
setAudioSink
为本次会话设置一个音频接收器。设置完成后,SDK 会将音频数据回调到该音频接收器。
输入参数
audioSink:音频接收器,传 null 可移除现有目标。
返回值
无
调用示例
重启云端应用
restartCloudApp
重启云端应用进程。
输入参数
无
返回值
无
调用示例
向云应用粘贴文本
pasteText
向云端应用输入框粘贴文本(需输入框已聚焦)。
输入参数
参数名称 | 必选 | 类型 | 描述 |
text | 是 | String | 要粘贴的文本内容。 |
返回值
无
调用示例
禁用云端软键盘
setDisableCloudInput
禁用云端软键盘(仅支持移动端应用)。
输入参数
参数名称 | 必选 | 类型 | 描述 |
disableCloudInput | 是 | boolean | 是否禁用云端输入。 |
返回值
无
调用示例
获取云端触摸屏交互对象
getTouchScreen
获取当前会话的云端触摸屏交互对象,用于和云端触摸屏进行交互。该方法将本地触摸视图的事件转换为云端触摸的事件,实现远程触控交互。
输入参数
无
返回值
可以和云端触摸屏进行交互的 TouchScreen 对象。
调用示例
触发云端触屏触摸事件
touch
向云端触摸屏发送触摸事件,模拟用户对云端设备的触控操作(如点击、滑动等)。
输入参数
参数名称 | 必选 | 类型 | 描述 |
x | 是 | float | 触摸点在渲染视图中的水平坐标。 |
y | 是 | float | 触摸点在渲染视图中的垂直坐标。 |
eventType | 是 | int | 触摸事件类型,0代表按下,1代表移动,2代表抬起。 |
fingerID | 是 | int | 触摸点唯一标识符。同一手势中,同一手指的多次事件(如按下→移动→抬起)共享相同 fingerID,用于跟踪多点触控轨迹。 来源:通常从 android.view.MotionEvent.getPointerId(int) 获取。 |
width | 是 | int | 渲染视图的宽度(像素单位)。用于坐标归一化计算,确保 x 值在 [0, width] 范围内有效。 |
height | 是 | int | 渲染视图的高度(像素单位)。用于坐标归一化计算,确保 y 值在 [0, height] 范围内有效。 |
timestamp | 是 | long | 含义:事件发生的时间戳(单位:毫秒),基于系统启动时间(SystemClock.uptimeMillis())。 用途:保证事件顺序一致性,云端可据此处理时序逻辑(如手势识别)。 来源:从 MotionEvent.getEventTime() 获取。 |
返回值
无
调用示例
获取实例截图地址
获取实例截图地址(getInstanceImageAddress)
输入参数
Map<String, Object> params,内容为:
参数名称 | 必选 | 类型 | 描述 |
instanceId | 是 | String | 实例 ID。 |
quality | 否 | int | 截图质量,取值范围 0-100,默认 20。 |
screenshot_width | 否 | int | 截图宽度。 |
screenshot_height | 否 | int | 截图高度。 |
返回值
参数名称 | 类型 | 描述 |
url | String | 截图地址,失败返回 null。 |
示例
Map<String, Object> params = new HashMap<>();params.put("instance_id", mInstanceIds.get(0));params.put("screenshot_quality", 80);params.put("screenshot_width", 1080);params.put("screenshot_height", 1920);String url = getAndroidInstance().getInstanceImageAddress(params);
获取实例截图
获取实例截图信息(getInstanceImage) 。
输入参数
Map<String, Object> params,内容为:
参数名称 | 必选 | 类型 | 描述 |
instanceId | 是 | String | 实例 ID。 |
quality | 否 | int | 截图质量,取值范围 0-100,默认 20。 |
screenshot_width | 否 | int | 截图宽度。 |
screenshot_height | 否 | int | 截图高度。 |
AsyncCallback 异步回调对象。
返回值
异步回调 AsyncCallback,成功返回 Bitmap 对象。
示例
Map<String, Object> params = new HashMap<>();params.put("instance_id", mInstanceIds.get(0));params.put("screenshot_quality", 80);params.put("screenshot_width", 1080);params.put("screenshot_height", 1920);AsyncCallback<Bitmap> callback = new AsyncCallback<Bitmap>() {@Overridepublic void onSuccess(Bitmap bitmap) {}@Overridepublic void onFailure(int code, String errorMsg) {}};getAndroidInstance().getInstanceImage(params, callback);
上传文件到实例
上传文件到实例(uploadFile)。
默认上传到 /sdcard/Download 目录下,可使用 path 指定上传目录(仅支持/sdcard/ 下目录)。
输入参数
参数名称 | 必选 | 类型 | 描述 |
instanceId | 是 | String | 目标云手机实例 ID。 |
files | 是 | UploadFileItem[] | 要上传的文件数组。 |
file.fileBytes | 是 | byte[] | 文件二进制内容。 |
file.file | 是 | String | 文件名(含扩展名)。 |
file.path | 否 | String | 云端存储路径,如 "/sdcard/Download/"。 |
callback | 否 | AsyncCallback<String> | 异步回调对象。 |
返回值
JSON 字符串:{Code: int; Message: string; FileStatus: [{ CloudPath: string; FileName: string }]}
参数名称 | 类型 | 描述 |
Code | int | 错误码。 |
Message | String | 错误消息。 |
FileStatus | Object[] | 文件状态对象。 |
FileStatus.CloudPath | String | 云端路径。 |
FileStatus.FileName | String | 文件名。 |
示例
private void upload(ArrayList<Uri> fileList, boolean isMedia) {UploadFileItem[] files = new UploadFileItem[fileList.size()];for (int i = 0; i < fileList.size(); i++) {files[i] = new UploadFileItem();files[i].fileBytes = readFilesFromUris(fileList.get(i));files[i].fileName = getFileNameFromUri(fileList.get(i));files[i].filePath = "/sdcard/Movies/";}AsyncCallback<String> callback = new AsyncCallback<String>() {@Overridepublic void onSuccess(String response) {// 示例数据 {Code=0, Message='null', FileStatus=[FileStatus{FileName='testDownloadFile', CloudPath='/sdcard/Download/testDownloadFile'}]}UploadResponse uploadResponse = GsonUtils.fromJson(response, UploadResponse.class);LogUtils.d(TAG, "get response: " + uploadResponse);if (uploadResponse == null) {mResultTextView.setText("文件上传异常: uploadResponse 解析失败");return;}if (uploadResponse.Code == 0) {StringBuilder sb = new StringBuilder("文件上传成功:\\n");if (uploadResponse.FileStatus != null) {for (UploadResponse.FileStatus status : uploadResponse.FileStatus) {sb.append("文件名: ").append(status.FileName).append("\\n云端路径: ").append(status.CloudPath).append("\\n");}}mResultTextView.setText(sb.toString());} else {mResultTextView.setText("文件上传失败: " + uploadResponse.Message);}}@Overridepublic void onFailure(int code, String errorMsg) {mResultTextView.setText("文件上传失败: " + code + ", " + errorMsg);}};if (isMedia) {getAndroidInstance().uploadMedia(mInstanceIds.get(0), files, callback);} else {getAndroidInstance().uploadFile(mInstanceIds.get(0), files, callback);}}
上传媒体到实例
上传媒体文件到实例(uploadMedia)。
固定上传至 /data/media/0/DCIM 目录,上传完毕会通知系统添加媒体文件到相册中。
输入参数
返回值
JSON 字符串:{Code: int; Message: string;}
示例
获取文件下载地址
获取实例文件的下载地址(getInstanceDownloadAddress)。
输入参数
参数名称 | 必选 | 类型 | 描述 |
instanceId | 是 | String | 实例 ID。 |
path | 是 | String | 要下载的云端文件的路径。 |
返回值
参数名称 | 类型 | 描述 |
address | String | 下载地址,失败返回 null。 |
示例
String address = getAndroidInstance().getInstanceDownloadAddress(mInstanceIds.get(0), "/sdcard/Download/testDownloadFile");
获取日志文件下载地址
获取云手机实例的日志文件的下载地址(getInstanceDownloadLogcatAddress)。
输入参数
参数名称 | 必选 | 类型 | 描述 |
instanceId | 是 | String | 实例 ID。 |
recentDays | 是 | int | 表示下载几天内修改过的 logcat 日志文件。 |
返回值
参数名称 | 类型 | 描述 |
address | String | 下载地址,失败返回 null。 |
示例
String address = getAndroidInstance().getInstanceDownloadAddress(mInstanceIds.get(0), 3);
下载文件
下载文件(downloadFile)。
输入参数
参数名称 | 必选 | 类型 | 描述 |
params | 是 | Map<String, Object> | 下载参数,包含: instance_id:云手机实例 ID。 path:要下载的云端文件的路径。 |
localFile | 是 | File | 下载文件存储到本地的 File,应用需确保有写入权限。 |
callback | 否 | AsyncCallback<String> | 异步回调对象。 |
返回值
异步回调结果。
示例
String localPath = "/sdcard/Download/testDownloadFile";String cloudPath = "/sdcard/Download/testDownloadFile";Map<String, Object> params = new HashMap<>();params.put("instance_id", mInstanceIds.get(0));params.put("path", cloudPath);AsyncCallback<String> callback = new AsyncCallback<String>() {@Overridepublic void onSuccess(String response) {mResultTextView.setText("文件下载成功");}@Overridepublic void onFailure(int code, String errorMsg) {mResultTextView.setText("文件下载失败: " + code + ", " + errorMsg);}};getAndroidInstance().downloadFile(params, new File(localPath), callback);
切换输入法
切换输入法(switchIME)。
输入参数
参数名称 | 必选 | 类型 | 描述 |
ime | 是 | String | "cloud" :云端输入法。 "local":本地输入法。 |
示例
getAndroidInstance().switchIME("local");
设置设备 GPS 信息
设置设备 GPS 信息(setLocation),支持批量实例操作。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { Longitude: double; Latitude: double } }
参数名称 | 必选 | 类型 | 描述 |
Longitude | 是 | double | 经度。 |
Latitude | 是 | double | 纬度。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("Longitude", 121.4737);param.addProperty("Latitude", 31.2304);params.put(instanceId, param);}getAndroidInstance().setLocation(params, mBatchCallback);
设置设备分辨率
设置设备分辨率(setResolution)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { Width: int; Height: int; DPI?: int } };
参数名称 | 必选 | 类型 | 描述 |
Width | 是 | int | 宽。 |
Height | 是 | int | 高。 |
DPI | 否 | int | 像素密度。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("Width", 1080);param.addProperty("Height", 1920);param.addProperty("DPI", 420);params.put(instanceId, param);}getAndroidInstance().setResolution(params, mBatchCallback);
粘贴文本
粘贴文本(paste)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { Text: string } }
参数名称 | 必选 | 类型 | 描述 |
Text | 是 | String | 文本。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("Text", "粘贴的文本内容");params.put(instanceId, param);}getAndroidInstance().paste(params, mBatchCallback);
发送文本到剪切板
发送文本到剪切板(sendClipboard)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { Text: string } }
参数名称 | 必选 | 类型 | 描述 |
Text | 是 | String | 文本。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("Text", "剪贴板内容");params.put(instanceId, param);}getAndroidInstance().sendClipboard(params, mBatchCallback);
摇一摇
摇一摇(shake)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { } }
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().shake(params, mBatchCallback);
设置设备传感器信息
设置设备传感器信息(setSensor)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { Type: 'accelerometer' | 'gyroscope'; Values: double[] } }
参数名称 | 必选 | 类型 | 描述 |
Type | 是 | String | 传感器 leasing accelerometer(加速器),gyroscope(陀螺仪)。 |
Accuracy | 否 | int | 精度。 |
Values | 是 | double[] | 传感器对应的值,数组长度为 3,分别表示 x/y/z 轴的值。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("Type", "accelerometer");param.addProperty("Accuracy", 3);JsonArray values = new JsonArray();values.add(0.5);values.add(-0.3);values.add(0.8);param.add("Values", values);params.put(instanceId, param);}getAndroidInstance().setSensor(params, mBatchCallback);
发送 App binder 消息
发送 App binder 消息(sendTransMessage)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { PackageName: string; Msg: string } }
参数名称 | 必选 | 类型 | 描述 |
PackageName | 是 | String | 包名。 |
Msg | 是 | String | 消息。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("PackageName", "com.example.app");param.addProperty("Msg", "消息内容");params.put(instanceId, param);}getAndroidInstance().sendTransMessage(params, mBatchCallback);
查询实例属性
查询实例属性(describeInstanceProperties)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().describeInstanceProperties(params, mBatchCallback);
修改实例属性
修改实例属性(modifyInstanceProperties)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: param },其中 param 内容参考:
{"RequestID": "modify_req_20230901001","DeviceInfo": {"Brand": "Samsung","Model": "Galaxy S24"},"ProxyInfo": {"Enabled": true,"Protocol": "socks5","Host": "proxy.example.com","Port": 1080,"User": "user123","Password": "pass123"},"GPSInfo": {"Longitude": 121.4737,"Latitude": 31.2304},"SIMInfo": {"State": 1 // sim 状态。 1:未插入 sim 卡 5:sim 卡已就绪},"LocaleInfo": {"Timezone": "Asia/Shanghai"},"LanguageInfo": {"Language": "zh","Country": "CN"},"ExtraProperties": [{"Key": "custom_property1","Value": "value1"},{"Key": "custom_property2","Value": "value2"}]}
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("RequestID", UUID.randomUUID().toString());JsonObject deviceInfo = new JsonObject();deviceInfo.addProperty("Brand", "brand");deviceInfo.addProperty("Model", "model");param.add("DeviceInfo", deviceInfo);JsonObject proxyInfo = new JsonObject();proxyInfo.addProperty("Enabled", true);proxyInfo.addProperty("Protocol", "socks5");proxyInfo.addProperty("Host", "proxy.example.com");proxyInfo.addProperty("Port", 1080);proxyInfo.addProperty("User", "user");proxyInfo.addProperty("Password", "password");param.add("ProxyInfo", proxyInfo);JsonObject gpsInfo = new JsonObject();gpsInfo.addProperty("Longitude", 121.4737);gpsInfo.addProperty("Latitude", 31.2304);param.add("GPSInfo", gpsInfo);JsonObject simInfo = new JsonObject();simInfo.addProperty("State", 1);simInfo.addProperty("PhoneNumber", "1234567890");simInfo.addProperty("IMSI", "imsi");simInfo.addProperty("ICCID", "iccid");param.add("SIMInfo", simInfo);JsonObject localeInfo = new JsonObject();localeInfo.addProperty("Timezone", "Asia/Shanghai");param.add("LocaleInfo", localeInfo);JsonObject languageInfo = new JsonObject();languageInfo.addProperty("Language", "zh");languageInfo.addProperty("Country", "CN");param.add("LanguageInfo", languageInfo);JsonArray extraProperties = new JsonArray();JsonObject extraProp = new JsonObject();extraProp.addProperty("Key", "key");extraProp.addProperty("Value", "value");extraProperties.add(extraProp);param.add("ExtraProperties", extraProperties);params.put(instanceId, param);}getAndroidInstance().modifyInstanceProperties(params, mBatchCallback);
查询已安装第三方应用
查询已安装第三方应用(listUserApps)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }
返回值
类型:BatchTaskResponse
其中每个实例 ID 返回的 JsonElement 内容参考:
{"AppList": [{"PackageName": "com.android.chrome","LastUpdateTimeMs": 1667232000000,"FirstInstallTimeMs": 1635724800000,"VersionName": "115.0.5790.166","Label": "Chrome"},{"PackageName": "com.tencent.mm","LastUpdateTimeMs": 1667328405000,"FirstInstallTimeMs": 1635811200000,"VersionName": "8.0.35","Label": "微信"},{"PackageName": "com.zhihu.android","LastUpdateTimeMs": 1667256803000,"FirstInstallTimeMs": 1635897600000,"VersionName": "8.27.0","Label": "知乎"}],"Code": 0,"Msg": "xx"}
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().listUserApps(params, mBatchCallback);
修改前台应用保活状态
修改前台应用保活状态(modifyKeepFrontAppStatus)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { PackageName: string; Enable: boolean; RestartInterValSeconds: int; } }
参数名称 | 必选 | 类型 | 描述 |
PackageName | 是 | String | 包名。 |
Enable | 是 | Boolean | 是否保活。 |
RestartInterValSeconds | 是 | int | 重新拉起最长间隔。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("PackageName", "com.example.app");param.addProperty("Enable", true);param.addProperty("RestartInterValSeconds", 5);params.put(instanceId, param);}getAndroidInstance().modifyKeepFrontAppStatus(params, mBatchCallback);
查询前台应用保活状态
查询前台应用保活状态(describeKeepFrontAppStatus)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }
返回值
类型:BatchTaskResponse
其中每个实例 ID 返回的 JsonElement 内容参考:
{"PackageName": "com.example.app","Enable": true,"RestartInterValSeconds": 3,"Code": 0,"Msg": "xx"}
参数名称 | 类型 | 描述 |
PackageName | String | 包名。 |
Enable | Boolean | 是否保活。 |
RestartInterValSeconds | int | 重新拉起最长间隔。 |
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().describeKeepFrontAppStatus(params, mBatchCallback);
卸载应用
卸载应用(unInstallByPackageName)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { PackageName: string; } }
参数名称 | 必选 | 类型 | 描述 |
PackageName | 是 | String | 包名。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("PackageName", "com.example.app");params.put(instanceId, param);}getAndroidInstance().unInstallByPackageName(params, mBatchCallback);
启动应用
启动应用(startApp)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { PackageName: string; ActivityName: string } }
参数名称 | 必选 | 类型 | 描述 |
PackageName | 是 | String | 包名。 |
ActivityName | 是 | String | 启动的 Activity 名称。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("PackageName", "com.example.app");param.addProperty("ActivityName", "com.example.app.MainActivity");params.put(instanceId, param);}getAndroidInstance().startApp(params, mBatchCallback);
停止应用
停止应用(stopApp)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { PackageName: string; } }
参数名称 | 必选 | 类型 | 描述 |
PackageName | 是 | String | 包名。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("PackageName", "com.example.app");params.put(instanceId, param);}getAndroidInstance().stopApp(params, mBatchCallback);
清除应用数据
清除应用数据(clearAppData)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { PackageName: string; } }
参数名称 | 必选 | 类型 | 描述 |
PackageName | 是 | String | 包名。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("PackageName", "com.example.app");params.put(instanceId, param);}getAndroidInstance().clearAppData(params, mBatchCallback);
启用应用
启用应用(enableApp)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { PackageName: string; } }
参数名称 | 必选 | 类型 | 描述 |
PackageName | 是 | String | 包名。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("PackageName", "com.example.app");params.put(instanceId, param);}getAndroidInstance().enableApp(params, mBatchCallback);
禁用应用
禁用应用(disableApp)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { PackageName: string; } }
参数名称 | 必选 | 类型 | 描述 |
PackageName | 是 | String | 包名。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("PackageName", "com.example.app");params.put(instanceId, param);}getAndroidInstance().disableApp(params, mBatchCallback);
摄像头播放媒体文件
摄像头播放媒体文件(startCameraMediaPlay)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { FilePath: string; Loops: int }; }
参数名称 | 必选 | 类型 | 描述 |
FilePath | 是 | String | 文件路径。 |
Loops | 是 | int | 循环次数,负数表示无限循环。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("FilePath", "/sdcard/media.mp4");param.addProperty("Loops", 3);params.put(instanceId, param);}getAndroidInstance().startCameraMediaPlay(params, mBatchCallback);
摄像头停止播放媒体文件
摄像头停止播放媒体文件(stopCameraMediaPlay)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }; }
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().stopCameraMediaPlay(params, mBatchCallback);
查询当前摄像头媒体播放状态
查询当前摄像头媒体播放状态(describeCameraMediaPlayStatus)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }; }
返回值
类型:BatchTaskResponse
其中每个实例 ID 返回的 JsonElement 内容参考:
{"FilePath": "/sdcard/video.mp4","Loops": 3,"Code": 0,"Msg": "xx"}
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().describeCameraMediaPlayStatus(params, mBatchCallback);
摄像头显示图片
摄像头显示图片(displayCameraImage)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { FilePath: string; }; }
参数名称 | 必选 | 类型 | 描述 |
FilePath | 是 | String | 文件路径。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("FilePath", "/sdcard/image.png");params.put(instanceId, param);}getAndroidInstance().displayCameraImage(params, mBatchCallback);
增加后台保活应用
增加后台保活应用(addKeepAliveList)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { AppList: string[] } }
参数名称 | 必选 | 类型 | 描述 |
AppList | 是 | String[] | App 列表。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();JsonArray appList = new JsonArray();appList.add("com.example.app");param.add("AppList", appList);params.put(instanceId, param);}getAndroidInstance().addKeepAliveList(params, mBatchCallback);
移除后台保活应用
移除后台保活应用(removeKeepAliveList)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { AppList: string[] } }
参数名称 | 必选 | 类型 | 描述 |
AppList | 是 | String[] | App 列表。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();JsonArray appList = new JsonArray();appList.add("com.example.app");param.add("AppList", appList);params.put(instanceId, param);}getAndroidInstance().removeKeepAliveList(params, mBatchCallback);
覆盖后台保活应用
覆盖后台保活应用(setKeepAliveList)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { AppList: string[] } }
参数名称 | 必选 | 类型 | 描述 |
AppList | 是 | String[] | App 列表。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();JsonArray appList = new JsonArray();appList.add("com.example.app");param.add("AppList", appList);params.put(instanceId, param);}getAndroidInstance().setKeepAliveList(params, mBatchCallback);
查询后台保活应用
查询后台保活应用(describeKeepAliveList)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }; }
返回值
类型:BatchTaskResponse
其中每个实例 ID 返回的 JsonElement 内容参考:
{"AppList": ["com.wechat", "com.alipay", "com.dingtalk"],"Code": 0,"Msg": "xx"}
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().describeKeepAliveList(params, mBatchCallback);
清空后台保活应用
清空后台保活应用(clearKeepAliveList)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }; }
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().clearKeepAliveList(params, mBatchCallback);
静音开关
静音开关(mute)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { Mute: boolean } }
参数名称 | 必选 | 类型 | 描述 |
Mute | 是 | Boolean | 是否静音。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("Mute", true);params.put(instanceId, param);}getAndroidInstance().mute(params, mBatchCallback);
媒体库文件搜索
媒体库文件搜索(mediaSearch)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { Keyword: string } }
参数名称 | 必选 | 类型 | 描述 |
Keyword | 是 | String | 关键字。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();param.addProperty("Keyword", "搜索关键词");params.put(instanceId, param);}getAndroidInstance().mediaSearch(params, mBatchCallback);
重启实例
重启实例(reboot)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }; }
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().reboot(params, mBatchCallback);
查询所有应用列表
查询所有应用列表(listAllApps)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }
返回值
类型:BatchTaskResponse
其中每个实例 ID 返回的 JsonElement 内容参考:
{"AppList": [{"PackageName": "com.android.chrome","LastUpdateTimeMs": 1667232000000,"FirstInstallTimeMs": 1635724800000,"VersionName": "115.0.5790.166","Label": "Chrome"},{"PackageName": "com.tencent.mm","LastUpdateTimeMs": 1667328405000,"FirstInstallTimeMs": 1635811200000,"VersionName": "8.0.35","Label": "微信"},{"PackageName": "com.zhihu.android","LastUpdateTimeMs": 1667256803000,"FirstInstallTimeMs": 1635897600000,"VersionName": "8.27.0","Label": "知乎"}],"Code": 0,"Msg": "xx"}
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().listAllApps(params, mBatchCallback);
关闭应用至后台
关闭应用至后台(moveAppBackground)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }; }
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().moveAppBackground(params, mBatchCallback);
新增应用安装黑名单
新增应用安装黑名单(addAppInstallBlackList)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { AppList: string[] } }
参数名称 | 必选 | 类型 | 描述 |
AppList | 是 | String[] | App 列表。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();JsonArray appList = new JsonArray();appList.add("com.example.app");param.add("AppList", appList);params.put(instanceId, param);}getAndroidInstance().addAppInstallBlackList(params, mBatchCallback);
移除应用安装黑名单
移除应用安装黑名单(removeAppInstallBlackList)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { AppList: string[] } }
参数名称 | 必选 | 类型 | 描述 |
AppList | 是 | String[] | App 列表。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();JsonArray appList = new JsonArray();appList.add("com.example.app");param.add("AppList", appList);params.put(instanceId, param);}getAndroidInstance().removeAppInstallBlackList(params, mBatchCallback);
覆盖应用安装黑名单
覆盖应用安装黑名单(setAppInstallBlackList)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { AppList: string[] } }
参数名称 | 必选 | 类型 | 描述 |
AppList | 是 | String[] | App 列表。 |
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {JsonObject param = new JsonObject();JsonArray appList = new JsonArray();appList.add("com.example.app");param.add("AppList", appList);params.put(instanceId, param);}getAndroidInstance().setAppInstallBlackList(params, mBatchCallback);
查询应用安装黑名单
查询应用安装黑名单(describeAppInstallBlackList)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }; }
返回值
类型:BatchTaskResponse
其中每个实例 ID 返回的 JsonElement 内容参考:
{"AppList": ["com.wechat", "com.alipay", "com.dingtalk"],"Code": 0,"Msg": "xx"}
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().describeAppInstallBlackList(params, mBatchCallback);
清空应用安装黑名单
清空应用安装黑名单(clearAppInstallBlackList)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }; }
返回值
类型:BatchTaskResponse
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().clearAppInstallBlackList(params, mBatchCallback);
获取系统导航栏显示状态
获取系统导航栏显示状态(getNavVisibleStatus)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }; }
返回值
类型:BatchTaskResponse
其中每个实例 ID 返回的 JsonElement 内容参考:{ Visible: boolean}
参数名称 | 类型 | 描述 |
Visible | Boolean | 是否可见。 |
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().getNavVisibleStatus(params, mBatchCallback);
获取系统媒体音量大小
获取系统媒体音量大小(getSystemMusicVolume)。
输入参数
类型:Map<String, JsonObject> params,内容为 { [InstanceId: string]: { }; }
返回值
类型:BatchTaskResponse
其中每个实例 ID 返回的 JsonElement 内容参考:
{"Volume":15,"Code": 0,"Msg": "xx"}
示例
Map<String, JsonObject> params = new HashMap<>();for (String instanceId : mInstanceIds) {params.put(instanceId, new JsonObject());}getAndroidInstance().getSystemMusicVolume(params, mBatchCallback);
相关数据结构
批量操作返回值
批量操作返回值(BatchTaskResponse)。
数据结构
参数名称 | 类型 | 描述 |
Code | int | Code 为 0 表示所有操作成功完成,非0值表示操作失败或部分失败。 Code:10001, Msg: "invalid param"。 Code:10002, Msg: "invalid token"。 Code:10003, Msg: "invalid operate"。 |
Msg | String | 暂无意义。 |
SuccResult | Map<String, JsonElement> | 成功操作的实例结果映射: key:云手机实例 ID。 value:该实例操作成功的返回结果对象,使用 JsonElement 封装,具体内容取决于操作类型,见具体操作接口说明。 |
FailResult | Map<String, JsonElement> | 失败操作的实例结果映射: key:云手机实例 ID。 value:该实例操作失败的返回结果对象,使用 JsonElement 封装,通常包含错误码和错误信息。例如: { "Code": 10100, "Msg": "cai operation denied" } |
使用示例
AndroidInstance instance = TcrSdk.getInstance().getAndroidInstance();Map<String, JsonObject> params = new HashMap<>();String[] instanceIds = {"instance1", "instance2"};for (String instanceId : instanceIds) {JsonObject param = new JsonObject();param.addProperty("Width", 1080);param.addProperty("Height", 1920);param.addProperty("DPI", 420);params.put(instanceId, param);}AsyncCallback<BatchTaskResponse> callback = new AsyncCallback<BatchTaskResponse>() {public void onSuccess(BatchTaskResponse response) {// 遍历成功实例for (Entry<String, JsonElement> entry : response.SuccResult.entrySet()) {String instanceId = entry.getKey();JsonElement result = entry.getValue();// 处理结果}// 遍历失败实例for (Entry<String, JsonElement> entry : response.FailResult.entrySet()) {String instanceId = entry.getKey();JsonElement result = entry.getValue();// 处理错误}}@Overridepublic void onFailure(int code, String msg) {// 处理错误Log.e(TAG, "Operation failed: " + code + ", " + msg);}};instance.setResolution(params, callback);