From 7d1b8afe20f053493c23a725d2bb73ab355856c3 Mon Sep 17 00:00:00 2001
From: Yuan <294065614@qq.com>
Date: Wed, 24 Jul 2024 14:38:08 +0800
Subject: [PATCH 01/12] 1
---
sdk/src/CPHCloudApp.js | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/sdk/src/CPHCloudApp.js b/sdk/src/CPHCloudApp.js
index cfdefcc..ae7ece0 100644
--- a/sdk/src/CPHCloudApp.js
+++ b/sdk/src/CPHCloudApp.js
@@ -117,6 +117,13 @@ class CPHCloudApp {
window.addEventListener('unload', () => {
this.exit();
});
+ this.util.bind(window, 'online', () => {
+ this.appController.createSocket();
+ this.reconnect();
+ });
+ this.util.bind(window, 'offline', () => {
+ this.appController.terminateSocketWorker();
+ });
}
fullscreenToggle(fullscreenElementId) {
@@ -322,6 +329,8 @@ class CPHCloudApp {
}
exit() {
+ this.util.unbind(window, 'online');
+ this.util.unbind(window, 'offline');
this.appController.exit();
this.appController = null;
}
--
Gitee
From 5f6192e76cd5ac46b10b2c543e49bf964811954f Mon Sep 17 00:00:00 2001
From: Yuan <294065614@qq.com>
Date: Wed, 24 Jul 2024 14:48:17 +0800
Subject: [PATCH 02/12] 1
---
sdk/src/CPHCloudApp.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/sdk/src/CPHCloudApp.js b/sdk/src/CPHCloudApp.js
index ae7ece0..b04ed9b 100644
--- a/sdk/src/CPHCloudApp.js
+++ b/sdk/src/CPHCloudApp.js
@@ -15,6 +15,7 @@
import AppController from './AppController';
import PROTOCOL_CONFIG from './config/protocolConfig';
import Logger from './Logger';
+import Util from './Util';
import NoDebugger from './NoDebugger';
const WEBSOCKET_PREFIX = 'wss://';
@@ -42,6 +43,7 @@ const INIT_VIRTUAL_DEVICE_STATE = 2048;
*/
class CPHCloudApp {
constructor(containerId, options) {
+ this.util = new Util();
let defaults = {};
// 参数校验
let msg = this._verify(options);
--
Gitee
From 571d357d89f99b9180203329e892b151249328a2 Mon Sep 17 00:00:00 2001
From: Yuan <294065614@qq.com>
Date: Fri, 26 Jul 2024 09:27:18 +0800
Subject: [PATCH 03/12] 1
---
sdk/src/AppController.js | 26 ++++++++++++++++++++++++++
sdk/src/CPHCloudApp.js | 12 ++++++++++++
sdk/src/CloudApp.js | 12 ++++++++++++
sdk/src/DeviceHardwareHandler.js | 18 ++++++++++++++----
4 files changed, 64 insertions(+), 4 deletions(-)
diff --git a/sdk/src/AppController.js b/sdk/src/AppController.js
index 73c2174..fd2addb 100644
--- a/sdk/src/AppController.js
+++ b/sdk/src/AppController.js
@@ -1483,6 +1483,32 @@ class AppController {
}
}
+ setDefaultCamera(devId) {
+ this.deviceHardwareHandler.setDefaultCamera(devId);
+ }
+
+ getCameras() {
+ let videoDevices = [];
+ navigator.mediaDevices.enumerateDevices()
+ .then(devices => {
+ devices.forEach(device => {
+ if (device.kind === "videoinput") {
+ videoDevices.push(device);
+ }
+ });
+ console.log(videoDevices)
+ // 输出视频摄像头列表
+ return videoDevices;
+ })
+ .catch(error => {
+ console.log("获取设备列表失败:", error);
+ });
+ }
+
+ resetDefaultCamera() {
+ this.deviceHardwareHandler.defaultCameraId = '';
+ }
+
/**
* 销毁
* @param {boolean}} reserveSocketWorker 是否需要销毁socket,exit场景,延迟close socket,close前需保留socket
diff --git a/sdk/src/CPHCloudApp.js b/sdk/src/CPHCloudApp.js
index cfdefcc..c2e0727 100644
--- a/sdk/src/CPHCloudApp.js
+++ b/sdk/src/CPHCloudApp.js
@@ -382,6 +382,18 @@ class CPHCloudApp {
sendClipboardData(data) {
this.appController.sendClipboardData(data);
}
+
+ setDefaultCamera(devId) {
+ this.appController.setDefaultCamera(devId);
+ }
+
+ getCameras() {
+ this.appController.getCameras();
+ }
+
+ resetDefaultCamera() {
+ this.appController.resetDefaultCamera();
+ }
}
CPHCloudApp.RESOLUTIONS = {...PROTOCOL_CONFIG.RESOLUTIONS};
diff --git a/sdk/src/CloudApp.js b/sdk/src/CloudApp.js
index f72fe0c..fd59fe8 100644
--- a/sdk/src/CloudApp.js
+++ b/sdk/src/CloudApp.js
@@ -103,6 +103,18 @@ class CloudApp {
this.channel.updateResolutionAndTouch();
}
+ setDefaultCamera(devId) {
+ this.channel.setDefaultCamera(devId);
+ }
+
+ getCameras() {
+ this.channel.getCameras();
+ }
+
+ resetDefaultCamera() {
+ this.channel.resetDefaultCamera();
+ }
+
_getChannel(containerId, options) {
const channelType = options.channelType || 'WebSocket';
if (channelType === 'WebSocket') {
diff --git a/sdk/src/DeviceHardwareHandler.js b/sdk/src/DeviceHardwareHandler.js
index 4f01fa5..46db268 100644
--- a/sdk/src/DeviceHardwareHandler.js
+++ b/sdk/src/DeviceHardwareHandler.js
@@ -35,6 +35,7 @@ class DeviceHardwareHandler {
this.util = new Util();
this.sensorMsgType = PROTOCOL_CONFIG.SENSOR_MESSAGE_TYPE;
this.gpsLocationMsgType = PROTOCOL_CONFIG.GPS_LOCATION_MESSAGE_TYPE;
+ this.defaultCameraId = "";
}
handleStartPreviewReq(cameraMsgBody, cameraMsgHeader) {
@@ -56,10 +57,15 @@ class DeviceHardwareHandler {
videoOptions.width.ideal = cameraWidth;
videoOptions.height.ideal = PC_CAMERA_MAX_HEIGHT;
}
- if (this.options.isMobile) {
- videoOptions.facingMode = {
- exact: MOBILE_CAMERA_MODE_MAP[cameraMsgHeader.devId]
- };
+
+ if (this.defaultCameraId) {
+ videoOptions.deviceId = {
+ exact: this.defaultCameraId
+ }
+ } else if (this.options.isMobile){
+ videoOptions.facingMode = {
+ exact: MOBILE_CAMERA_MODE_MAP[cameraMsgHeader.devId]
+ };
}
this.cameraPlayer = new CameraPlayer({
videoOptions,
@@ -71,6 +77,10 @@ class DeviceHardwareHandler {
});
}
+ setDefaultCamera(devId) {
+ this.defaultCameraId = devId;
+ }
+
handleStopPreviewReq(cameraMsgHeader) {
this.cameraMsgHeader = cameraMsgHeader;
this.sendMediaMsgCmdData(CAMERA_RSP_LEN, this.options.cameraMsgType.OPT_CAMERA_STOP_PREVIEW_RSP, 'CAMERA');
--
Gitee
From 76c466d3142d4b6b446d47b64feef571622fd99c Mon Sep 17 00:00:00 2001
From: Yuan <294065614@qq.com>
Date: Mon, 29 Jul 2024 11:57:17 +0800
Subject: [PATCH 04/12] 1
---
sdk/src/DirectionHandler.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/sdk/src/DirectionHandler.js b/sdk/src/DirectionHandler.js
index 324c5e9..b87c713 100644
--- a/sdk/src/DirectionHandler.js
+++ b/sdk/src/DirectionHandler.js
@@ -569,7 +569,7 @@ class DirectionHandler {
// 旋转前需要先取消旋转,避免叠加旋转
this.cancelTransform();
if (this.options.isMobile) {
- const deviceOrientation = window.screen.orientation.angle || window.orientation;
+ const deviceOrientation = window?.screen?.orientation?.angle || window.orientation;
if ([DEVICE_ORIENTATION_ANGLES.PORTRAIT,DEVICE_ORIENTATION_ANGLES.REVERSE_PORTRAIT].includes(deviceOrientation)) {
this.portraitMobile();
} else if ([DEVICE_ORIENTATION_ANGLES.LANDSCAPE, DEVICE_ORIENTATION_ANGLES.REVERSE_LANDSCAPE].includes(deviceOrientation)) {
@@ -692,7 +692,7 @@ class DirectionHandler {
setTimeout(() => {
let width = document.documentElement.clientWidth;
let height = document.documentElement.clientHeight;
- const deviceOrientation = window.screen.orientation.angle || window.orientation;
+ const deviceOrientation = window?.screen?.orientation?.angle || window.orientation;
if ([DEVICE_ORIENTATION_ANGLES.PORTRAIT,DEVICE_ORIENTATION_ANGLES.REVERSE_PORTRAIT].includes(deviceOrientation)) {
if ([PROTOCOL_CONFIG.ORIENTATION[0], PROTOCOL_CONFIG.ORIENTATION[16]].includes(this.orientation)) {
playerWidth = width;
--
Gitee
From da33acc62d8eb81744771bdbb61ba36a9194f4ed Mon Sep 17 00:00:00 2001
From: Yuan <294065614@qq.com>
Date: Mon, 29 Jul 2024 14:17:01 +0800
Subject: [PATCH 05/12] 1
---
README.md | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/README.md b/README.md
index 48ecdaf..7b21d0b 100644
--- a/README.md
+++ b/README.md
@@ -337,6 +337,36 @@ Chrome restricts the usage of WebCryptographyApi to secure origins. It means 'ht
进入云手机多任务页面。
+#### 4.16 云手机设置默认相机功能
+
+- 接口介绍
+
+ cloudApp.setDefaultCamera(devId);
+
+- 功能描述
+
+ 设置需要调用的相机,参数为相机的设备Id(deviceId)。
+
+#### 4.17 云手机获取可用相机功能
+
+- 接口介绍
+
+ cloudApp.getCameras();
+
+- 功能描述
+
+ 返回所有可用的相机,可根据返回值设置默认相机。
+
+#### 4.18 云手机恢复默认相机功能
+
+- 接口介绍
+
+ cloudApp.resetDefaultCamera();
+
+- 功能描述
+
+ 重置指定相机,调用默认相机。
+
### 5. 开发指导
### 6. FAQ
--
Gitee
From 0b605a6c39da4c62f5ede19e180912fd86099946 Mon Sep 17 00:00:00 2001
From: Yuan <294065614@qq.com>
Date: Tue, 30 Jul 2024 15:43:17 +0800
Subject: [PATCH 06/12] 1
---
README.md | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 7b21d0b..5a81ff2 100644
--- a/README.md
+++ b/README.md
@@ -62,7 +62,7 @@ node package.js | 将产物输出为 tar.gz 包,放在 dist 目录下
#### 3.3 产物下载
```shell
## 可以直接下载本项目构建好的产物进行尝鲜使用,下载解压后,修改 demo.html 中 ip、port 即可连接
-https://gitee.com/HuaweiCloudDeveloper/huaweicloud-cloudPhoneAccess-web/releases/tag/v23.3.0
+https://gitee.com/HuaweiCloudDeveloper/huaweicloud-cloudPhoneAccess-web/releases/tag/v23.3.0
```
#### 3.4 FAQ
(1)Error in connection establishment: net::ERR_CERT_AUTHORITY_INVALID
@@ -379,6 +379,13 @@ Chrome restricts the usage of WebCryptographyApi to secure origins. It means 'ht
- 部署后页面提示样式找不到。如:style is null | undefined
- 请检查是否修改了demo.html中DOM元素的ID,当前ID与逻辑绑定,正在优化中。若要修改,请确保JS操作DOM时,对应的ID参数也一并进行了修改。
-### 7. license
+### 7. 新购服务器验证接入
+H5端使用步骤:
+1、从链接https://gitee.com/HuaweiCloudDeveloper/huaweicloud-cloudPhoneAccess-web/releases/tag/v23.12.3 下载“CloudAppSdk_H5_Release_23.12.3.rar”压缩包并解压
+2、加压后使用文本编辑软件编辑demo.html,搜索"aes_key",将值从“111...111”改为想要连接的云手机的phone_id,修改后保存
+3、使用浏览器打开demo.html,输入云手机服务器的ip和H5端口,点击“ENTER”
+4、连接之后会跳转到新的页面,需要信任一下证书,点击信任后关闭新的页面,回到原来页面刷新一下就可以看到云手机画面。
+
+### 8. license
Apache License 2.0。
--
Gitee
From b4a953c763fcfcdf46774225d6e81c174dcf07fd Mon Sep 17 00:00:00 2001
From: Yuan <294065614@qq.com>
Date: Mon, 29 Jul 2024 11:55:56 +0800
Subject: [PATCH 07/12] 1
(cherry picked from commit d904ca62f42c5426fa540beb0ba867625bd164db)
---
sdk/demo/demo.html | 2 ++
sdk/src/CPHCloudApp.js | 2 ++
sdk/src/DirectionHandler.js | 4 ++--
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/sdk/demo/demo.html b/sdk/demo/demo.html
index 8aaaf45..b7d78a0 100644
--- a/sdk/demo/demo.html
+++ b/sdk/demo/demo.html
@@ -451,7 +451,9 @@ Copyright 2022 Huawei Cloud Computing Technology Co., Ltd.
+
-