H5端SDK接入

H5 SDK:

步骤1  登录云手机控制台。

步骤2  单击“SDK管理”,单击“H5 SDK”,进入SDK 接口说明页,支持下载集成文档及SDK程序包。

引入SDK包

1、引用JS文件

页面引入jssdk < script src="../ddysdk.js"></script>
//引入ddysdk对象
const { SDK, EnumListenerType, EnumErrorType, ExtendMessageSerivces, webApi, EnumWebApiListenerType } = ddysdk;

2、webApi部分介绍

webApi模块包含用户登录、登出、分组及设备列表获取、设备信息查询、设备可视化进入Token获取、设备截图等功能.
2.1 获取当前用户登录状态
webApi.isLogin :Boolean
表示当前用户是否已经登录
2.2 获取当前用户信息
webApi.userInfo :Object 返回当前已登录用户的信息,如果未登录则各项参数为null
{
ucid:"用户Id",
nickName:"用户昵称",
merAppKey:"商户Key",
userLoginToken:"当前用户登录的token",
userToken:"当前用户token"
}
2.2 用户登录
webApi.login({ userName: String, passWord: String }): Promise <LoginUserInfo>(session)登录成功后,用户状态将保持到浏览器关闭,如需主动退出请调用logout
2.4 用户退出登录
webApi.logout():Promise
2.5 获取设备列表
webApi.getDeviceList(): Promise<Array<OrderGroup>>;
如无特指,后续api接口中的orderId均为getDeviceList()返回的数据中的设备订单号
2.6 获取设备信息
webApi.getDeviceInfo(orderId:Number|String): Promise <OrderDeviceInfo>
2.7 获取指定订单设备连接可视化需要的token参数
webApi.getDeviceStartToken(orderId:Number|String):Promise <String>;
2.8 获取设备的截图
webApi.getDeviceScreenShot(orderId:Number|String, useBlob:Boolean):Promise <Blob|ArrayBuffer>
seBlob:默认值为false,如果为true则截图返回类型为Blob对象,否则为ArrayBuffer对象
2.9 webApi相关事件监听的注册与注销
2.9.1 注册
/**
* 注册监听事件
* @param type 事件类型 EnumWebApiListenerType的枚举之一
* @param listener 事件
* @param once 仅触发一次后,就移除该监听,默认为false
*/ webApi.on(type: Symbol, listener: Function, once?: boolean): boolean;
Demo
/**
* 注册用户登录状态变更
*/

webApi.on(EnumWebApiListenerType.UserStateChanged, () => {
//变更用户状态
setUserLoginState();
});
2.9.2 注销
/**
* 注册监听事件
* @param type 事件类型 EnumWebApiListenerType的枚举之一
* @param listener 事件
*/
webApi.off(type: Symbol, listener: Function): boolean;

3、云设备可视化连接SDK部分介绍

3.1 实例化sdk实例
//初始化sdk及容器 var sdk = new SDK({
/**可视化容器筛选器,如 #id*/
selector: "#player"
});
3.2 初始化sdk
init({
/**是否尝试使用webrtc+video播放器(gpu解码),同时开启tryVideoPlayer和tryWebRtc时,tryWebRtc优先级更高
* 默认为false*/
tryWebRtc?: Boolean;
/** 是否尝试使用video播放器(gpu解码) 默认为true */
tryVideoPlayer?: Boolean;
/**
* 当检测到设备是非手持设备时,是否启用键盘输入(启用键盘后云设备将无法查看输入法界面,无法使用鼠标在云端界面操作输入字符)
* 默认为false*/
enablePCKeyboard?: boolean;
}): Promise;
3.3 常规只读属性获取
3.3.1 指示画面是否已经开始渲染
Boolean值 sdk.rendering
3.3.2 指示当前云设备是否处于横屏状态
Boolean值 sdk.isHorizontal
3.3.3 指示需要跟随用户操作方向旋转的Element是否要旋转
Boolean值 sdk.needElementRotate
3.3.4 指示SDK初始化中
Boolean值 sdk.sdkIniting
3.3.5 指示SDK初始化完毕
Boolean值 sdk.sdkInited
3.3.6 获取云设备屏幕宽度
Number值 sdk.width
3.3.7 获取云设备屏幕高度
Number值 sdk.height
3.3.8 指示画布是否发生旋转
Boolean值 sdk.isCanvasRotate
3.3.9 指示云设备是否已连接并保持连接
Boolean值 sdk.connected
3.3.10 指示当前方案是否使用webrtc
Boolean值 sdk.useWebRtc
3.3.11 指示当前方案是否使用MediaSource硬解方案
Boolean值 sdk.useDemuxer
3.4 获取或设置是否允许用户控制界面
获取 let userInput = sdk.userInput; //Boolean值,默认为true
设置 sdk.userInput=false;
3.5 获取或设置是否静音
获取 let muted= sdk.muted; //Boolean值,默认为falsee
设置 sdk.muted=false;
3.6 容器发生大小变更时主动通知修正sdk界面尺寸
sdk.resize(); //非必要调用, window.onresize时无需通知
3.7 连接设备
sdk.connect( {
/**设备码率 1500*/
quality: number;
/**
* 视图角度(仅限移动设备)
* "auto" 表示随设备变化而变化
* false 以手持设备横屏状态下旋转视图
* true 以手持设备竖屏状态下旋转视图
*/ phoneViewAngle: "auto" | true | false;
/**AppKey */
appKey: String;
/**商户Key */
merAppKey: String;
/**设备token */
token: String;
}): Promise;
3.8 断开设备
sdk.disConnect():void;
3.9 获取云设备截图
/**
* 通知云设备触发截图
* @param width 参考宽度(返回的截图宽度未必为该值,仅作为参考)
* @param height 参考高度(返回的截图高度未必为该值,仅作为参考)
* @returns 返回Promise对象,截图成功将执行resolve(图片流对应的base64串) 失败执行reject(reason)
*/
sdk.shot(width: number, height: number): Promise <string>;
3.10 云设备系统功能键
3.10.1 返回到桌面
/**
* 触发返回桌面功能键
* @returns 返回Promise对象,处理成功将执行resolve() 失败执行reject(reason)
*/
sdk.goHome(): Promise;
3.10.2 返回上一步
/**
* 触发返回上一步键
* @returns 返回Promise对象,处理成功将执行resolve() 失败执行reject(reason)
*/
sdk.goBack(): Promise
3.10.3 触发MENU键
/**
* 触发MENU键
* @returns 返回Promise对象,处理成功将执行resolve() 失败执行reject(reason)
*/
sdk.goMenu(): Promise
3.10.4 增加音量
/**
* 增加音量
* @returns 返回Promise对象,处理成功将执行resolve() 失败执行reject(reason)
*/
sdk.setVolumeUp(): Promise
3.10.5 降低音量
/**
* 降低音量
* @returns 返回Promise对象,处理成功将执行resolve() 失败执行reject(reason)
*/
sdk.setVolumeDown(): Promise
3.11 云设备APP管理
3.11.1 运行APP
/**
* 运行APP
* @param packageName 包名
* @param activityName 无activityName则启动app默认activity
* @param extrasData 扩展信息,默认为null
*/
sdk.appRun(
packageName: string,
activityName?: string,
extrasData?: string
): Promise <string>;
3.11.2 结束APP
/**
* 结束APP
* @param packageName 要结束的包名
*/
sdk.appStop(packageName: string): Promise <string>;
3.11.3 结束APP(批量)
/**
* 结束APP(批量)
* @param packageNames 要结束的包名数组
*/
sdk.appStopMultiple(packageNames: Array<String>): Promise<string>;
3.11.4 结束并清除APP数据
/**
* 结束并清除app数据
* @param packageName 要结束的包名
*/
sdk.appStopAndClearData(packageName: string): Promise <string>;
3.11.5 结束并清除APP数据(批量)
/**
* 结束并清除app数据(批量)
* @param packageNames 要结束的包名数组
*/
sdk.appStopAndClearDataMultiple(packageNames: Array<String>): Promise<string>;
3.11.6 检测APP状态
/**
* 检查应用状态
* @param packageName 要查询的包名
*/
sdk.appCheckState(
packageName: string
): Promise <{
/**状态码*/
status: "4" | "5" | "6" | "7";
/**对应的状态描述*/
msg: "下载中" | "安装中" | "未安装" | "已安装";
}>;

3.11.7 获取当前运行应用顶层包名
/**
* 获取当前运行顶层app包名
* @returns {Promise <string>}
*/
sdk.appGetCurrentPageage(): Promise<string>
3.11.8 获取所有应用列表
/**
* 获取云端应用列表
* @returns {Promise <Array<{isSystem:true,name:"短信",packageName: "com.android.cts",packagePath:"...",versionCode:1,versionName:"7.0-123"}>>}
*/
sdk.appGetList(): Promise<Array<{
/**是否是系统应用*/ isSystem: boolean;
/**应用名*/ name: string;
/**包名*/ packageName: string;
/**包路径*/ packagePath: string;
//**版本Code*/ versionCode: number;
/**版本字符描述*/ versionName: string;
}>>;
3.11.9 安装APP
/**安装APP
* @param packageName 包名
* @param url 下载地址
* @param runAfterInstall 安装成功后是否立即运行
* @param runExtrasData runAfterInstall为true时,提供给启动的扩展信息,默认为null
* @returns status:1,msg: 安装成功
*/
sdk.appInstall(packageName: string, url: string, runAfterInstall: boolean, runExtrasData?: string): Promise <{
/**状态码*/
status: "1" | "2" | "3";
/**对应的状态描述*/
msg: "安装成功" | "下载失败" | "安装失败";
}>;
3.11.10 卸载APP
/**
* 卸载app 成功则返回字符串 success
* @param packageName 包名
*/
sdk.appUninstall(packageName: string): Promise <string>;
3.11.11 卸载APP(批量)
/**
* 卸载app(批量) 成功则返回字符串 success
* @param packageNames 要卸载的包名数组
*/
sdk.appUninstallMultiple(packageNames: Array<String>): Promise<string>;;
3.12 SDK实例相关事件注册与注销
3.12.1 注册
/**
* 注册监听事件
* @param type 事件类型 EnumListenerType的枚举之一
* @param listener 事件
* @param once 仅触发一次后,就移除该监听,默认为false
*/
sdk.on(type: Symbol, listener: Function, once?: boolean): boolean;
//DEMO
//云设备屏幕发生了旋转
sdk.on(EnumListenerType.RotateChanged,
/*
* @param data: {width:1080, height:720, isHorizontal:false,isCanvasRotate:false,needElementRotate:false} e 参数
*/
function (e) {
console.log("RotateChanged:" + JSON.stringify(e));
});
//错误事件
sdk.on(EnumListenerType.Error,
/**
@param type:Symbol,msg:{} data
*/
function (data) {
switch(data.type){
case EnumErrorType.VCExit:{
//云设备vc强制要求退出可视化
console.log("Error:" + JSON.stringify(data));
break;
}
case EnumErrorType.WebSocketError:{
//websocket异常断开引发的错误
console.log(`Error:${data.msg.fromBinary?"来自可视化流":"来自反控流"}` );
break;
}
case EnumErrorType.CloudError:{
//运设备异常推送
console.log(`Error:错误码:${data.msg.webCode},错误描述:${data.msg.describe}` );
break;
}
}
});
//设备连接成功
sdk.on(EnumListenerType.DeviceConnected, function () {
console.log("DeviceConnected");
setConnectState(true);
});
//设备断开连接
sdk.on(EnumListenerType.DeviceDisconnected, function () {
console.log("DeviceDisconnected");
setConnectState(false);
});
//连接后画面首次开始渲染时触发
sdk.on(EnumListenerType.CanvasRendering, function () {
console.log("CanvasRendering");
setLoading(null);
let timing = sdk.performance.getData().timing;
timing && console.log(timing.toString());
});
/**云端回到桌面或者离开桌面 */
/**
* 云端回到桌面或者离开桌面
* @param {Object} data
* @param {boolean} data.inDesktop 是否在桌面
*/
sdk.on(EnumListenerType.CloudDesktopNotice,(data) => {
console.log("CloudDesktopNotice" + JSON.stringify(data));
});
3.12.2 注销
/**
* 注销监听事件
* @param type 事件类型 EnumListenerType的枚举之一
* @param listener 事件,如果传空,则移除所有该类型事件
*/
sdk.off(type: Symbol, listener: Function): boolean;
3.13 获取sdk实例本次连接云设备统计信息
/*@type {DeviceTiming}*/
let timing = sdk.performance.getData().timing; //若sdk从未连接过,则该值可能为null
if(timing)console.log(timing.toString());
 
接口API附录

1、LoginUserInfo

interface LoginUserInfo {
/**用户Token */
UserToken: String;
/**用户Token */
UserLoginToken: String;
/**商户Key */
MerAppKey: String;
/** 是否允许恢复出厂设置 1 0 */
IsAuthRecovery: Number;
/**通知消息 */
MsgNum: Number;
/**系统消息 */
SysMsgNum: Number;
/**卡券未领取数量 */
VoucherCardNum: Number;
/**新手福利对象 */
NewWelFare: NewWelFareInfo;
/**公告信息 */
Bulletin: BulletinInfo;
/**时长卡信息 */
DurationCardsInfo: DurationCardsInfo;
/**时长卡24小时内提醒信息 */
RemindInfo: Array<DurationCardsRemind>;
/**VIP月卡48小时内提醒信息 */
VMonthCardRemindInfo: Array<MonthCardsRemind>;
/**GVIP月卡48小时内提醒信息 */
GMonthCardRemindInfo:Array<MonthCardsRemind>;
/**自动登录的Token字符串 */
AutoLoginToken: String;
/**是否开启图形设备锁 */
IsLock: Boolean;
/**订单数量 */
OrderNum: Number;
/** 注册时间 */
RegTime: String;
/**服务器时间 */
SystemTime: String;
/**窗口多开数量 */
CKDKNum: Number;
/**用户异常提醒 */
AbnormalRemind: Number;
/**即将过期优惠券数量 */
WillExpireCardNum: Number;
/**未使用优惠券数量 */
CouponCardNum: Number;
/**未使用兑换券数量 */
ExchangeCouponCardNum: Number;
/**为空未开通 不为空为有效期 */
SelfVpnExpireTime: String;
/**应用消息推送标记 0全推 1外推 2内推 3全不推 */
AppMsgFlag: Number;
/**异常消息推送标记 0全推 1外推 2内推 3全不推 */
AbnormalMsgFlag: Number;
/**到期消息推送标记 0全推 1外推 2内推 3全不推 */
ExpireMsgFlag: Number;
/**真实用户Id,用于在个人中心显示时使用 */
RealUCID: Number;
/**用户ID */
UCID: String;
/**昵称 */
NickName: String;
/**手机号 */
PhoneNumber: String;
/**头像 */
Avatar:String;
}

2、OrderGroup

/**
* web返回的分组信息
*/
interface OrderGroup {
/**分组ID */
GroupID: Number;
/**
* 组名
*/
GroupName: String;
/**分组的排序*/
GroupSort: Number;
/**订单数量*/
OrderCount: Number;
/**订单列表*/
OrderList: Array<OrderBaseInfo>;
}

3、OrderBaseInfo

/**
* web返回的订单信息
*/
interface OrderBaseInfo {
/**订单号前缀,(S:时长卡订单,V:月卡订单) */
OrderIdPrefix: String;
/**订单后缀(a:Anbox订单) */
OrderIdSuffix: String;
/** 剩余时长 */
RemainingDuration: Number;
/**剩余月卡时长(单位:H) */
RemainingMonthCard: Number;
/** 月卡提醒对象 */
MonthCardRemindInfo: MonthCardRemindInfo;
/**正在运行的订单已运行时间 */
Runingtime: String;
/**设备地址:用于APP通过该地址连接设备进行通讯(截图) */
DeviceHost: String;
/**设备Tcp链接 */
DeviceTcpHost: String;
/**组ID */
GroupID: Number;
/**是否已经启用设备锁*/
IsLock: Boolean;
/**是否可以执行同步操作:true显示同步按钮,false不显示同步按钮 */
SyncEnable: Boolean;
/**华为云设备类型:YunDeviceType枚举 */
YunDeviceType: YunDeviceType;
/** 是否付费订单 */
IsPaidOrder: Boolean;
/**剩余保护时间 */
ProtectTime: String;
/**是否是PC可操作的订单 */
IsPCOrder: Boolean;
/**设备内扩展服务信息列表 */
ExServiceInfos: Array<ExServiceInfos>;
/**订单视频TOKEN */
OrderAC: String;
/**是否是ADB订单 */
IsADB: Boolean;
/**异常提醒标识 0无1有 */
AbnormalRemind: Number;
/**最新消息时间 */
NewMsgTimeSpan: Number;
/**root 状态 0root 1非root */
RoComCphNonRoot: Number;
/**订单号 */
OrderId: Number;
/**订单备注 */
OrderRemark: String;
/**订单状态 */
OrderStatus: OrderStatus;
/**会话Id */
SessionId: String;
/**订单创建时间 */
OrderCreateTime: String;
/**月卡类型:3:VIP 4:GVIP */
MonthCardType: Number;
/**设备名 */
PhoneName: String;
/**暂停订单套餐名称 */
StayOrderName: String;
/**来源应用 */
SourceAppId: String;
}

4、MonthCardRemindInfo

/**
* 月卡提醒对象
*/
interface MonthCardRemindInfo {
/**月卡过期时间 */
MonthCardExpiredTime: String;
/**剩余小时数(客户端格式化后显示,到期提醒也根据这个值判断) */
ResidueHours: Number;
}

5、YunDeviceType

enum YunDeviceType{
/** 未分配 0 */
UnAssigned = 0,
/** Qume设备 1 */
Qume = 1,
/** Anbox设备 2*/
Anbox = 2,
}

6、ExServiceInfos

interface ExServiceInfos {
/**扩展服务码 */
ServiceCode: String;
/**扩展服务名称 */
ServiceName: String;
/** 扩展服务描述 */
ServiceDesc: String;
/**扩展服务图标 */
ServeicIcon: String;
/**扩展服务显示顺序 */
ServiceSort: Number;
/**扩展服务到期时间 格式:xx天xx小时 */
ExpireTime: String;
}

7、OrderStatus

/**订单状态 */
enum OrderStatus {
/**运行中 */
Running = 2,
/**重启中 */
Rebooting = 5,
/**设备故障 */
AbnormalEnd = 6,
/**恢复出厂中 */
Reseting = 7,
/**数据备份中 */
DataBackUp = 10,
/**数据恢复中 */
Recovery2 = 12,
/**续费后,恢复数据 */
Recovery3 = 13,
/**实例过期,服务存续 */
DataExprieRenew = 15,
/**已删除 */
Deleted = -1,
/**已过期,数据备份 */
DataBackuping = -3,
/**无可用设备 */
DataRenewNoDev = -5,
/**数据备份失败 */
DataBackUpFail = -6,
/**数据恢复失败 */
RecoveryAbNormal = -8,
/**账户冻结中 */
MiGu_AccountFree = -50,
}

8、OrderDeviceInfo

/**订单设备信息 */
interface OrderDeviceInfo {
/**设备信息 */
DeviceInfos:Array<KeyValue>;
/**扩展服务列表 */
ExServiceInfos:Array<OrderExServiceInfo>;
}

9、KeyValue

/**键值信息 */
interface KeyValue {

/**键 */
Key:String;
/**值 */
Value:String;
}

10、OrderExServiceInfo

/**订单扩展信息 */
interface OrderExServiceInfo {
/**扩展服务码 */
ServiceCode:String;
/** 扩展服务名称 */
ServiceName:String;
/**开通状态(1:已开通,0:未开通) */
OpenStatus:Number;
}

11、EnumWebApiListenerType

/**
* webApi事件类型常量枚举
*/
declare interface EnumWebApiListenerType{
/**
* 用户登录状态发生变更
*/
UserStateChanged: Symbol;
}

12、EnumListenerType

/**
* sdk事件相关类型枚举
*/
interface EnumListenerType {
/**屏幕发生了旋转*/
RotateChanged: Symbol;
/**发生异常*/
Error: Symbol;
/**设备连接成功,可以开始各项操作*/
DeviceConnected: Symbol;
/**设备失去连接*/
DeviceDisconnected: Symbol;
/**画面连接后首次开始渲染时触发*/
CanvasRendering: Symbol;
/**云端回到桌面或者离开桌面*/
CloudDesktopNotice: Symbol;
}

13、DeviceTiming

/**单次连接性能数据*/
interface DeviceTiming {
/**设备开始连接时间*/
deviceConnect: Number;
/**web初始化接口下发回调时间*/
deviceWebInited: Number;
/**数据流websocket连接开始时间*/
deviceBinaryWsConnect: Number;
/**数据流websocket连接成功的时间*/
deviceBinaryWsConnected: Number;
/**辅助流websocket连接开始时间*/
deviceScriptWsConnect: Number;
/**辅助流websocket连接成功的时间*/
deviceScriptWsConnected: Number;
/**设备连接成功的时间*/
deviceConnected: Number;
/**数据流初始化参数推送时间*/
videoParamSend: Number;
/**首个视频I帧收到时间(webrtc无该值)*/
firstVideoIFrameReceive: Number;
/**首个数据流数据包接收时间*/
firstBinaryDataReceive: Number;
/**首帧画面渲染时间*/
firstCanvasRender: Number;
/**数据流websocket断开连接的时间*/
deviceBinaryWsDisConnected: Number;
/**辅助流websocket断开连接的时间*/
deviceScriptWsDisConnected: Number;
/**设备断开连接的时间*/
deviceDisConnected: Number;
/**格式化数据信息*/
toString(): string;
}
本文档内容整理自移动云官方帮助中心(查看原文),仅供参考。