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. + -