安卓端SDK接入
1 基于移动云AK/SK认证
签名认证
目前云手机产品使用移动云开放API能力进行统一调用,使用移动云AccessKey/SecretKey进行身份验证,详请参考移动云官网说明 https://ecloud.10086.cn/op-help-center/doc/article/24283
2 安卓SDK概述
本文档面向安卓开发者,用于指导开发者快速接入云手机SDK,开发自己的云手机产品。
重要提醒:所有的 SDK 操作都必须在应用成功授权之后才能继续执行。
引入安卓SDK
2.1 安卓SDK下载
cloudphone_sdk_release_V2.1.1.aar
2.2 集成安卓SDK Demo下载
2.3 引入安卓SDK的aar及三⽅依赖
//引入客户端 sdk :library:ecloud_clientsdk集成了cloudphone_sdk_release_V2.1.1.aar
implementation project(path: ':library:ecloud_clientsdk')
implementation 'com.blankj:utilcodex:1.31.1'
implementation 'com.github.li-xiaojun:XPopup:2.10.0'
AndroidManifest.xml ⾥⾯添加如下权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
2.4 初始化SDK
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.e("MyApplication", "onCreate");
CloudPhoneManager.Companion.getInstance().initSdk(this);
}
}
3 功能接口说明
3.1 创建实例
• 接口介绍
|
fun getInstance(): ICloudPhone |
• 功能描述
创建ClonePhone-SDK对象
• 调用示例
ICloudPhone cloudPhone = CloudPhoneManager.Companion.getInstance();
3.2 初始化SDK
• 接口介绍
|
fun in itSdk(application: Application) |
• 功能描述
初始化SDK,一般在初始化阶段调
• 参数介绍
@param{application: Application}: application对象
• 调用示例
CloudPhoneManager.Companion.getInstance().initSdk(this);
3.3 获取云侧SDK版本号
• 接口介绍
|
fun getCloudVersion(): String |
• 功能描述
获取云侧SDK版本号
• 调用示例
cloudPhone.getCloudVersion()
3.4 获取自身SDK版本号
• 接口介绍
|
fun getSelfVersion(): String |
• 功能描述
获取自身SDK版本号
• 调用示例
cloudPhone.getSelfVersion()
3.5 更新 CloudphoneConfig
• 接口介绍
|
fun setCloudPhoneConfig(cloudPhoneConfig: CloudPhoneConfig?) |
• 功能描述
更新 CloudphoneConfig
• 调用示例
cloudPhone.setCloudPhoneConfig(cloudphoneConfig);
3.6 获取 CloudphoneConfig
• 接口介绍
|
fun getCloudPhoneConfig(): CloudPhoneConfig? |
• 功能描述
获取 CloudphoneConfig
• 调用示例
cloudPhone.getCloudPhoneConfig();
3.7 进入云手机(自定义UI场景)
• 接口介绍
|
fun startCloudPhone(viewGroup: ViewGroup, surfaceViewRender: MySurfaceViewRender, |
• 功能描述
进⼊云⼿机 ,适⽤于定制⾃定义UI场景 ,需要⾃⼰定制悬浮窗和底部导航栏UI及功能
• 参数介绍
@param {ViewGroup} viewGroup:承载云手机画面的 viewgroup
@param{MySurfaceViewRender} surfaceViewRender: 画面surfaceViewRender 或TextureviewRender
@param {CloudPhoneConfig} cloudPhoneConfig: 进入云手机的配置,具体如下
CloudPhoneConfig参数如下:
|
参数 |
是否必选 |
参数类型 |
描述 |
|
instanceId |
是 |
String |
云手机ID |
|
userId
|
是 |
String |
客户端唯一id,若没有可以用instance + "\_uid"代替 |
|
deviceid |
否 |
String |
设备id,可以参考android唯一设备id |
|
obsRegion |
否 |
String |
obs桶id |
|
useHardware |
否 |
Boolean |
是否使用硬解码,默认为true |
|
isSrsRequest |
否 |
Boolean |
是否是同屏互动请求,默认为false |
|
streamUrl |
否 |
String |
同屏互动拉流地址,isSrsRequest为true时必传 |
|
sensorConfig |
否 |
SensorConfig |
传感器开关,具体配置见下表 |
|
cloudId |
否 |
String |
云手机订单id |
|
token |
否 |
String |
用户token |
|
mobile |
否 |
String |
手机号 |
|
phyWidth |
否 |
Int |
云机规格: 一般是720/1080,默认720 |
|
navResourceId |
否 |
Int |
导航栏资源id |
|
webSocketUrl |
是 |
String |
信令地址,建连必须要用 |
|
enableLogToDebugOutput |
否 |
Boolean |
是否开启WebRtc调式日志,默认false |
|
localSurfaceViewRender |
否 |
MySurfaceViewRender |
打开摄像头本地预览控件 |
|
videoParams |
否 |
VideoParams |
音视频配置参数,有默认值 |
|
cloudSdkVersion |
否 |
int |
云侧sdk版本号 |
|
appAndOSMessageController |
否 |
IAppAndOSMessageController |
跟os通信接口文件 |
|
microphoneUseDC |
否 |
boolean |
麦克风数据用dc传输,默认false |
|
cameraUseDC |
否 |
boolean |
摄像头数据用dc传输,默认为false |
|
muteEnable |
否 |
boolean |
音频禁音标识 |
|
traceId |
否 |
string |
会话id |
|
stateReportDelay |
否 |
Long |
StateReport指标数据回调间隔时间 |
|
fecMode |
否 |
Int(@FecMode) |
Fec 配置,支持FecMode.noFec,FecMode.flexFec,FecMode.rsFec 三种 |
|
startCalMos |
否 |
boolean
|
是否开启MOS计分;true表示开启;默认为false,不开启;配合云侧SDK下发的端到端时延数据来计算 |
|
calMosPoint |
否 |
Int |
接收到calMosPoint个端到端时延点开始计算一次MOS分;默认为12个点,也就是一分钟计算一次MOS分 |
|
isNeedReconnect |
否 |
boolean |
ICE建联失败时,是否自动重连;true表示开启自动重连;默认为false,不自动重连 |
|
reconnectMaxLimit |
否 |
Int |
最大重连次数限制;默认5次;第一次重连不设延时;第二次重连开始每次递增500ms |
|
disconnectDelayTimeMillis |
否 |
Long |
建联超时时间,默认10s超时;设置为0则没有超时 |
|
idleReminderTimeMillis |
否 |
Long |
云机空闲时间设置,默认0s |
SensorConfig参数如下:
|
参数 |
是否必选 |
参数类型 |
描述 |
|
isAccelerometerEnabled |
否 |
Boolean |
是否注册加速度传感器,默认false |
|
isGyroscopeEnabled |
否 |
Boolean |
是否注册陀螺仪传感器,默认false |
|
isMagneticFieldEnabled |
否 |
Boolean |
是否注册磁场传感器,默认false |
|
isLightEnabled |
否 |
Boolean |
是否注册光线传感器,默认false |
|
isProximityEnabled |
否 |
Boolean |
是否注册距离传感器,默认false |
|
isPressureEnabled |
否 |
Boolean |
是否注册气压传感器,默认false |
|
isTemperatureEnabled |
否 |
Boolean |
是否注册气温传感器,默认false |
|
isRelativeHumidityEnabled |
否 |
Boolean |
是否注册湿度传感器,默认false |
|
isStepCountEnabled |
否 |
Boolean |
是否注册计步传感器,默认false |
• 调用示例
SensorConfig.Builder sensorConfig = new SensorConfig.Builder();
sensorConfig.enableAccelerometer(cbAccelerometer.isChecked())
.enableGyroscope(cbGyroscope.isChecked())
.enableMagneticField(cbMagnetic.isChecked())
.enablePressure(cbPressure.isChecked())
.enableLight(cbLight.isChecked())
.enableProximity(cbProximity.isChecked())
.enableRelativeHumidity(cbRelativeHumidity.isChecked())
.enableStepCount(cbStepCount.isChecked())
.enableHeartRate(cbHeartRate.isChecked())
.enableAmbientTemperature(cbAmbientTemperature.isChecked());
CloudPhoneConfig.Builder builder = new CloudPhoneConfig.Builder();
builder.cloudId(mAppDataStore.getString("cloudId", ""))
.instanceId(mAppDataStore.getString("instanceId", ""))
.userId(mAppDataStore.getString("userId", ""))
.phyWidth(Integer.parseInt(mAppDataStore.getString("lbphyWidth", "720")))
.useHardware(true)
.manager(1)
.enableLogToDebugOutput(cbLog.isChecked())
.token(mAppDataStore.getString("token", ""))
.webSocketUrl(mAppDataStore.getString("wsAddress", ""))
.sensorConfig(sensorConfig.build())
.cameraUseDC(false)
.deviceId(AndroidUtil.getAndroidID(this))
.startCalMos(true)
.isNeedReconnect(true)
.reconnectMaxLimit(10)
.idleReminderTimeMillis(10000)
.calMosPoint(12)
.enableWebsocketSSL(false);
// 启动云手机
cloudPhone.startCloudPhone(rlContainer, textureView, builder.build());
3.8 退出云手机
• 接口介绍
|
fun exitCloudPhone() |
• 功能描述
退出云手机
• 调用示例
cloudPhone.exitCloudPhone()
3.9 重连云手机
• 接口介绍
|
fun reStartCloudPhone() |
• 功能描述
重连云手机
• 调用示例
cloudPhone.reStartCloudPhone()
3.10 按键注⼊
• 接口介绍
|
fun injectKeyEvent(keyCode: Int, action: Int) |
• 功能描述
按键注⼊
• 参数介绍
@param{keyCode}: Int:Android按键的keyCode @param{action:} Int: Android按键的action
• 调用示例
cloudPhone.injectKeyEvent(KeyEvent.KEYCODE_BACK, KeyEvent.ACTION_DOWN);
cloudPhone.injectKeyEvent(KeyEvent.KEYCODE_BACK, KeyEvent.ACTION_UP);
3.11 静音
• 接口介绍
|
fun mute() |
• 功能描述
静音
• 调用示例
cloudPhone.mute()
3.12 取消静音
• 接口介绍
|
fun unMute() |
• 功能描述
取消静音
• 调用示例
cloudPhone.unMute()
3.13 设置视频参数
• 接口介绍
|
fun setVideoConfig(videoParam: VideoParams) |
• 功能描述
设置视频参数
• 参数介绍
@param {VideoParams} videoParam: 视频参数 ,见下表
|
参数名 |
是否必须 |
参数类型 |
描述 |
约束 |
|
bitrate |
否 |
int |
码率 |
最小不小于 1,000,000,最大不超过 10,000,000(单位:bps) |
|
gopSize |
否 |
int |
I 帧间隔 |
建议/一般为 10 的倍数 |
|
profile |
否 |
int |
编码复杂度 |
0:BASELINE<br>1:MAIN<br>2:HIGH |
|
frameRate |
否 |
int |
帧率 |
建议/一般为 30 的整数倍(如 30、60、90 等) |
• 调用示例
videoParams.bitrate= 4000000;
cloudPhone.setVideoConfig(videoParams);
3.14 云机音量调节
• 接口介绍
|
fun setAudioVolume(volume: Int, isForeground: Boolean) |
• 功能描述
云机音量调节
• 参数介绍
@param {Int} volume: 音量
@param {Boolean} isForeground: 应用是否在前台
• 调用示例
cloudPhone.isForeground(5, true)
•3.15 注册连接状态监听
• 接口介绍
|
fun registerCloudPhoneStateListener(cloudPhoneStateListener: CloudPhoneStateListener?) |
• 功能描述
注册连接状态监听
• 参数介绍
@param {CloudPhoneStateListener} cloudPhoneStateListener: 云手机连接状态回调
• 调用示例
cloudPhone.registerCloudPhoneStateListener(new CloudPhoneStateListener() {
@Override
public void onP2PConnected() {
// 也可以通过onConnectStatusChange的connectStatus=0判断
}
@Override
public void onP2PConnectFailed() {
// ice建联失败 ,回调跟⾃动重连有关;设置了⾃动重连 ,ice建联失败后会执⾏⾃动重连逻辑, 不会回调该⽅
// 法;如果没有设置⾃动重连 ,则⽴⻢回调该⽅法;
}
@Override
public void onFirstFrameRendered() {
// 也可以通过onConnectStatusChange的connectStatus=1800
}
@Override
public void onSocketSuccess(CloudPhoneConfig cloudPhoneConfig) {
// 也可以通过onConnectStatusChange的connectStatus=201判断
}
@Override
public void onDataChannelConnected() {
}
@Override
public void onConnectStatusChange(int connectStatus) {
super.onConnectStatusChange(connectStatus);
}
@Override
public void onPhoneConnectError(int errorCode, String errorMsg) {
}
@Override
public void registerOnCameraPermListener(boolean isRecord, CameraPermListener listener) {
// 摄像头权限动态申请
}
@Override
public void registerOnMicroPhonePermListener(CameraPermListener listener) {
// 麦克风权限动态申请
}
@Override
public void onShowLoadingAnim() {
// 处于后台⼀定时间后会断视频流,重新恢复视频流的时候需要动画弹窗提⽰
}
@Override
public void onKickEachOther() {
// 当云机被踢下线后,会调⽤该⽅法,可以执⾏退出云机操作并提醒⽤户
ToastManager.toast(this, "您的云机已在其他设备登录,当前连接已断开");
}
@Override
public void onPhoneIdleReminderTip() {
//云机空闲提醒,空闲时间由CloudPhoneConfig.idleReminderTimeMilis控制
ToastManager.toast(this, "您的云机很久没有操作,是否断开?");
}
});
connectStatus 状态码如下:
|
connectStatus |
描述 |
说明 |
|
-2 |
连接超时 |
默认 10 s 连接超时,可通过 CloudPhoneConfig.disconnectDelayTimeMillis 自定义超时时间 |
|
-1 |
初始化状态 |
|
|
0 |
连接断开 |
请检查请求参数是否正确 |
|
1 |
连接成功 |
|
|
200 |
开始连接信令 |
|
|
201 |
信令连接成功 |
|
|
202 |
信令连接关闭 |
请检查信令服务是否正常 |
|
203 |
信令连接失败 |
请检查信令服务是否正常 |
|
300 |
开始连接 p2p |
|
|
301 |
创建answer sdp失败 |
|
|
302 |
创建offer sdp失败 |
|
|
303 |
p2p建连失败 |
请检查网络是否正常 |
|
304 |
收到offer |
|
|
305 |
发送answer |
|
|
306 |
收到candidate |
|
|
1001 |
云机不支持同屏共享 |
|
|
1002 |
控制端不存在 |
|
|
1003 |
鉴权失败 |
请检查token是否过期 |
|
1004 |
分辨率异常 |
|
|
1800 |
首帧到达 |
|
|
2001 |
消息格式错误 |
|
|
2002 |
云机不在线 |
请检查云机sdk是否正常运行 请检查请求参数是否正确 |
|
2003 |
云机获取公网地址端口失败 |
|
|
2004 |
云机信令连接失败 |
|
|
2005 |
云机ice连接失败 |
|
|
2006 |
云机底层内部错误 |
|
|
2007 |
云机首帧出流失败 |
|
|
2008 |
云机同屏共享超过人数限制 |
|
|
2009 |
云机同屏共享失败,内部问题 |
|
|
2010 |
云机同屏共享主控上线,踢出共享端 |
|
|
3000 |
云机被占用 |
请检查云机是否正在串流 请检查互踢逻辑是否生效 |
|
4001 |
共享端被踢出房间 |
|
3.16 解注册云手机状态监听
• 接口介绍
|
fun unRegisterCloudPhoneStateListener(cloudPhoneStateListener: CloudPhoneStateListener?) |
• 功能描述
解除注册连接状态监听
• 参数介绍
@param {CloudPhoneStateListener} cloudPhoneStateListener: 云⼿机连接状态回调
• 调用示例
cloudPhone.unRegisterCloudPhoneStateListener(cloudPhoneStateListener);
3.17 注册云机⾳量变化监听
• 接口介绍
|
fun registerVolumeListener(context: Context, volumeChangeListener: VolumeChangeListener) |
• 功能描述
注册云机⾳量变化监听
• 参数介绍
@param {VolumeChangeListener} volumeChangeListener: ⾳量变化监听
• 调用示例
cloudPhone.registerVolumeListener(this, new VolumeChangeListener() {
@Override
public void onVolumeChanged(int i) {
}
});
3.18 解注册云机⾳量变化监听
• 接口介绍
|
fun unregisterVolumeListener() |
• 功能描述
解除注册云机⾳量变化监听
• 调用示例
cloudPhone.unregisterVolumeListener();
3.19 获取音量大小
• 接口介绍
|
fun getVolumeChangeObserver() : VolumeChangeObserver? |
• 功能描述
获取音量大小
• 调用示例
cloudPhone.getVolumeChangeObserver();
3.20 注册方向变化监听
• 接口介绍
|
fun registerOnOrientationChangeListener(listener: CloudPhoneOrientationChangeListener?) |
• 功能描述
注册方向变化监听:1 横屏 0 竖屏
• 参数介绍
@param{CloudPhoneOrientationChangeListener listener}:
interface CloudPhoneOrientationChangeListener { fun onOrientationChange(orientation: Int)
}
• 调用示例
cloudPhone.registerOnOrientationChangeListener(new CloudPhoneOrientationChangeListener() {
@Override
public void onOrientationChange(int orientation) {
dragView.setRotation(orientation == 1 ? 90f : 0f);
}
});
3.21 注册接收云机消息监听
• 接口介绍
|
fun registerCloudPhoneMessageListener(cloudPhoneMessageListener: CloudPhoneMessageListener?) |
• 功能描述
注册接收云机消息监听
• 参数介绍
@param {VolumeChangeListener} volumeChangeListener: 音量变化监听
• 调用示例
cloudPhone.registerCloudPhoneMessageListener(new CloudPhoneMessageListener() {
@Override
public void onReceiveCloudMessage(String message) {
Log.d(TAG, "onReceiveCloudMessage: " + message);
}
});
|
消息type |
说明 |
示例 |
|
5006 |
收到互踢消息 |
{"message":{"quit":true},"msgid":0,"timestamp":0,"type":5006} |
3.22 发送消息到云机
• 接口介绍
|
fun sendDataToCloudPhone(data: String) |
• 功能描述
发送消息到云机
• 参数介绍
@param{String} data: 要发送的数据
发送格式定义:
@param type: Int 消息类型
@param message: String 消息内容
• 调用示例
String json = "";
cloudPhone.sendDataToCloudPhone(json)
• 发送格式定义:
@param type: Int 消息类型
@param message: String 消息内容
|
协议名 |
消息 type |
方向 |
协议说明 |
|
cloud_app_config |
6001 |
双向 |
OS 向 APP 请求设备信息,APP 返回设备信息 |
|
sim_card |
6002 |
双向 |
OS 请求手机卡号码及和多号工作号,APP 回传 |
|
clipboard |
6003 |
双向 |
OS ⇄ APP 互传剪贴板内容 |
|
volume_sync |
6004 |
双向 |
OS ⇄ APP 声音同步 |
|
call |
6005 |
单向(OS→APP) |
OS 下发拨打电话指令 |
|
insert_call_record |
6006 |
单向(APP→OS) |
APP 上报当前通话记录 |
|
sms |
6007 |
单向(OS→APP) |
OS 下发发送短信指令 |
|
sms_permission |
6008 |
单向(APP→OS) |
APP 回传短信发送成功/失败结果 |
|
addShortCut |
6010 |
单向(OS→APP) |
OS 下发添加快捷方式信息 |
|
openOsApp |
6011 |
单向(APP→OS) |
APP 通知 OS 打开云机内某应用 |
|
navigation_bar_color |
6013 |
单向(OS→APP) |
OS 下发状态栏颜色设置 |
|
battery |
6014 |
单向(APP→OS) |
APP 上报电池电量信息 |
|
flash_light |
6015 |
单向(OS→APP) |
OS 下发手电筒开关状态 |
|
vibrator |
6016 |
单向(OS→APP) |
OS 下发震动指令 |
|
sensor |
6017 |
单向(APP→OS) |
APP 上报传感器数据 |
|
gps |
6018 |
单向(APP→OS) |
APP 上报 GPS 信息 |
|
permission_status_post |
6010 |
单向(APP→OS) |
APP 上报各权限授权状态 |
|
ysj_salt_property |
6020 |
单向(APP→OS) |
APP 设置云机系统属性 |
|
open_page_path |
6021 | 双向 |
OS ⇄ APP 打开网页或原生页面 |
|
os_app_top |
6026 |
单向(OS→APP) |
OS 通知当前栈顶应用包名 |
|
broadcast_post |
6027 | 双向 |
OS ⇄ APP 互发广播(发送/接收) |
• 发送/接受数据模版
1 // registerCloudPhoneMessageListener的onReceiveCloudMessage⽅法⾥监听云机消息回调,
{"type": xxxx, "message": ""}
• 发送设备信息
{"type":6001,"message":"{\"config\":
{\"user_id\":\"17321\",\"mobile\":\"18301052458\",\"platform\":\"Android\",\"cloud_model\":\"basic\",\"ch
annel\":\"0\",\"cic_phone\":\"\",\"timestamp\":1720428870326,\"app_version\":\"1.0.0\",\"resolution\":
{\"real_width\":1080,\"real_height\":2340,\"real_status_bar\":81,\"real_navigation_bar\":120},\"notch\":
{\"status_bar_height\":81,\"is_status_bar_visible\":false,\"notchSize\":
{\"left\":0,\"top\":0,\"right\":0,\"bottom\":0}},\"controller.login.mode\":\"\",\"controller.auth.version
\":2},\"Authorization\":\"\",\"appVersion\":\"1.0.0\"}"}
• 发送SIM卡信息
{"type":6002,"message":"{\"mobiles\":{\"sim_mobile\":[{\"carrierName\":\"中国移动
\",\"loginStatus\":0,\"subPhone\":\"18888888888\",\"type\":0}]},\"sim1\":\"{\\\"carrierName\\\":\\\"中国移动\\\",\\\"loginStatus\\\":0,\\\"subPhone\\\":\\\"18888888888\\\",\\\"type\\\":0}\",\"sim2\":\"null\"}"}
• 接收SIM信息
// OS打开电话、短信时触发
{"message":"","type":6002}
• 发送剪贴板数据
// type 6003 为剪贴板类型
{"type":6003,"message":"坚持党的全⾯领导是根本保证"}
• 接收剪贴板数据
//接收6003的type消息类型为云机剪贴板数据
{"message":"ALN-AL00 4.0.0.165(C00E155R4P16)","type":6003}
• 接收拨打电话数据
{"message":"{\"number\":\"10086\",\"tag\":0,\"callType\":0,\"caller\":\"18888888888\"}","type":6005}
• 发送当前通话记录
{"type":6006,"message":"{\"number\":\"10086\",\"dateLong\":1720443577979,\"duration\":5,\"callType\":2}"}
• 接收短信数据
{"message":"{\"content\":\"查话费
\",\"myPhoneNumber\":\"18888888888\",\"sendPhoneNumber\":\"10086\"}","type":6007}
• 发送短信发送成功或者失败的结果
{"type":6008,"message":"false"}
• 发送添加快捷⽅式信息
{"message":"
{\"pkg\":\"com.cbcc.wallpaper\",\"cls\":\"com.cbcc.wallpaper.ui.cloud.SplashActivity\",\"icon\":\"base64x xxxx\", \"name\":\"图库\"}", "type": 6010}
• 发送电池信息
{"type":6014,"message":"
{\"batteryStatus\":5,\"batteryHealth\":2,\"batteryLevel\":100,\"batteryVoltage\":4344,\"batteryTemperatur
e\":350,\"batteryTechnology\":\"Li-
poly\",\"batteryPlugged\":2,\"batteryPresent\":true,\"maxChargingCurrent\":0,\"maxChargingVoltage\":0,\"b
atteryCurrent\":450195,\"batteryCycleCount\":2,\"batteryFullCharge\":3081000,\"batteryChargeCounter\":200
0,\"batteryCapacityLevel\":-1,\"batteryChargeTimeToFullNowSeconds\":-1,\"batteryPropertyCapacity\":100,\"
batteryPropertyCurrentNow\":0,\"batteryCapacity\":3400}"}
• 接收⼿电筒开关状态信息
{"message":"false","type":6015}
• 发送云机属性
{"type":6020,"message":"{\"ysj_salt\":[{\"salt_key\":\"ysj_brand\",\"salt_value\":\"HUAWEI\"},
{\"salt_key\":\"ysj_manufacturer\",\"salt_value\":\"HUAWEI\"},
{\"salt_key\":\"ysj_security_openid\",\"salt_value\":\"184197\"},
{\"salt_key\":\"ysj_security_salt\",\"salt_value\":\"1720446497356\"},
{\"salt_key\":\"controller.cheat.nettype\",\"salt_value\":\"false\"},
{\"salt_key\":\"ysj_security\",\"salt_value\":\"97eec1ca4cb8d88e09c834417367dec039860d41442ada2870a44e087
cb0bff3\"},{\"salt_key\":\"ysj_model\",\"salt_value\":\"POT-AL00a\"}]}"}
• 接收栈顶信息
{"message":"{\"packageName\":\"com.huawei.browser\"}","type":6026
3.23 发送传感器数据到云机
• 接口介绍
|
fun sendVirtualDeviceData(deviceId: Int, optType: Int, data: Map<String, Any>?) |
• 功能描述
发送传感器数据到云机
• 参数介绍
@param{Int} deviceId: 传感器类型 0x0加速度 0x1陀螺仪 0x2磁场 0x3光线 0x4距离 0x5压⼒ 0x6计步步数 0x7湿度 0x8 温度 0x9计 步触发 0xoa gps
@param{Int} optType: 操作类型 0x1 使能 0x2禁⽌使能 0x10 数据 @param{Map<String, Any>} data 传感器数据 xyz accuracy
• 调用示例
try {
Map<String, Object> sensorData = new HashMap<>();
sensorData.put("x", event.values[0]);
sensorData.put("y", event.values[1]);
sensorData.put("z", event.values[2]);
sensorData.put("accuracy", event.accuracy);
sendSensorDataToCloudPhone(0, 1, sensorData);
} catch (Exception e) {
Log.e(TAG, "Failed to process sensor data: " + e.getMessage());
}
3.24 gps模拟定位
• 接口介绍
|
fun mockGps(map: Map<String, Any>) |
• 功能描述
gps模拟定位
• 参数介绍
|
参数 |
说明 |
是否必须 |
|
longitude |
经度 |
是 |
|
latitude |
纬度 |
是 |
|
altitude |
海拔 |
是 |
|
speed |
表示当前的移动速度,单位:米每秒,[0,400]米每秒 |
是 |
|
bearing |
当前的移动导向角单位:度。范围[0,360)度 |
是 |
|
accuracy |
表示当前的定位精度,单位:米。取值 ≥ 0 |
是 |
• 调用示例
HashMap<String, Object> gps = new HashMap<>();
gps.put("longitude", Double.parseDouble(longitude));
gps.put("latitude", Double.parseDouble(latitude));
cloudPhone.mockGps(gps);
3.25 重置云机物理分辨率
• 接口介绍
|
/** |
• 功能描述
重置云机物理分辨率
• 参数介绍
@param{Int} videoWidth: 视频流宽度 @param{Int} videoHeight: 视频流⾼度
@param{Int} surfaceWidth: 物理分辨率宽度 宽度为8的倍数 @param {Int} surfaceHeight: 物理分辨率⾼度 ⾼度为8的倍数
• 调用示例
cloudPhone.resetPhysicalResolution(1080, 1920);
3.26 获取统计信息
• 接口介绍
|
fun getStateReport(): StateReport? |
• 功能描述
获取统计信息
• 调用示例
cloudPhone.getStateReport();
3.27 恢复播放
• 接口介绍
|
/** |
• 功能描述
恢复视频播放功能
• 调用示例
cloudPhone.resumeRemoteVideoStream(textureView, false);
3.28 暂停播放
• 接口介绍
|
/** fun pauseRemoteVideoStream(videoSink: VideoSink?, delayTimestamp: Long = 0L) |
• 功能描述
暂停视频播放功能
• 调用示例
cloudPhone.pauseRemoteVideoStream(textureView, 10 * 1000);
3.29 云机截图
• 接口介绍
|
/** |
• 功能描述
云机内截图功能
• 调用示例
cloudPhone.screenCap();
3.30 注册同屏共享消息监听
• 接口介绍
|
fun registerCloudPhoneSrsListener(listener: CloudPhoneSrsListener?) |
• 功能描述
注册同屏共享消息监听
• 调用示例
cloudPhone.registerCloudPhoneSrsListener(new CloudPhoneSrsListener() {
@Override
public void onSrsShowNav(boolean b) {
// *接收到主控端导航栏隐藏或打开消息
// isShowtrue - 导航栏显⽰false - 导航栏隐藏
}
@Override
public void onUserEnter(@Nullable String s, @Nullable String s1) {
//收到⽤户加⼊同屏共享 */
}
@Override
public void onUserExited(@Nullable String s, @Nullable String s1) {
//*收到⽤户退出同屏共享 */
}
@Override
public void onSrsRoleChange(int i) {
///*收到⽤户角⾊权限变更消息
// SrsUserBean.ROLE_ADMIN -主控端
// SrsUserBean.ROLE_MANAGER -管理端
// SrsUserBean.ROLE_SEEKER -观众
}
@Override
public void onMainControllerShowNav(boolean b) {
//*主控端接收到共享端导航栏隐藏或打开消息
//*@param isShowtrue - 导航栏显⽰false - 导航栏隐藏 */
}
@Override
public void onSrsUserListChange(@Nullable ArrayList<SrsUserBean> arrayList) {
//同屏互动⽤户列表更新
}
@Override
public void onRoomKickOut(@Nullable String s) {
//踢出房间
}
});
3.31 主控端显⽰或隐藏导航栏
• 接口介绍
|
fun srsMainControllerShowNav(isShow: Boolean) |
• 功能描述
主控端显⽰或隐藏导航栏 ,在主控端显⽰或隐藏导航栏的时候 ,需要调⽤该⽅法通知共享端
• 调用示例
cloudPhone.srsMainControllerShowNav(true);
3.32 共享端请求显⽰或隐藏导航栏
• 接口介绍
|
fun srsShareShowNav(isShow: Boolean) |
• 功能描述
共享端请求显⽰或隐藏导航栏 ,在共享端显⽰或隐藏导航栏的时候 ,需要调⽤该⽅法通知主控端去隐藏或显⽰导航栏 ,通知调整视频分辨率
• 调用示例
cloudPhone.srsShareShowNav(true);
3.33 更新 SurfaceView 或者 TextureView
• 接口介绍
|
fun updateSurfaceView(videoSink: VideoSink?) |
• 功能描述
更新 SurfaceView 或者 TextureView
• 调用示例
CloudPhoneManager.Companion.getInstance().updateSurfaceView(surfaceView );
3.34 云机内切换到其它云机
• 接口介绍
|
fun switchCloudPhone(cloudPhoneConfig: CloudPhoneConfig) |
• 功能描述
在云机内想切换到其它云机 ,通过获取当前 CloudPhoneConfig 对象 ,更新 cloudId、instanceId 等必要信息 ,调⽤该⽅法可 以做到切换云机功能。
• 调用示例
CloudPhoneConfig cloudPhoneConfig = CloudPhoneManager.Companion.getInstance().getCloudPhoneConfig();
if (cloudPhoneConfig == null) {
return;
}
cloudPhoneConfig.setCloudId("dsahjhjsdahjkas");
cloudPhoneConfig.setInstanceId("22121122151d34624b12caebaed3c5b26");
cloudPhoneConfig.setPhyWidth(1080);
CloudPhoneManager.Companion.getInstance().switchCloudPhone(cloudPhoneConfig);