# distributeddemo **Repository Path**: MIKECODE/distributeddemo ## Basic Information - **Project Name**: distributeddemo - **Description**: 分布式相机图库,master适配4.1Release,5.0_distributeddemo适配5.0Release - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 3 - **Created**: 2024-07-29 - **Last Updated**: 2025-04-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 分布式相机图库 ## 介绍 分布式相机图库基于OpenHarmony分布式能力实现,两台设备安装本应用完成组网认证后,任一设备可以访问对端设备的摄像头进行预览、拍照,也可以访问对端设备的图库进行图片的查看、删除。 ## 效果预览 演示视频地址:https://live.csdn.net/v/428308 |分布式认证页1|分布式认证页2|分布式相机页面|分布式图库页1| 分布式图库页2 | | -------------------------------------------------------------------------------| -------------------------------------------------------------------------------| -------------------------------------------------------------------------------| -------------------------------------------------------------------------------|-----------------------------------------------------| |​![image](assets/image-20241008145356-dahmdg1.png)​|​![image](assets/image-20241008145413-u9jvfhi.png)​|​![image](assets/image-20241008145338-qmimqbv.png)​|​![image](assets/image-20241008145445-xtgaj10.png)​| ​![image](assets/image-20241008145514-xyspgo9.png)​ | 使用说明 本应用包括分布式认证页,分布式相机页,分布式图库页三个部分,具体说明如下: 1. 在分布式认证页,可以点击开始发现设备按钮,开始发现设备,点击在线设备中的设备进行绑定,点击可信设备进行解绑; 2. 在分布式相机页,点击拍照按钮进行拍照,点击切换按钮,可以选择使用远端摄像头; 3. 在分布式图库页,可以查看本地图片和远端图片,点击图片全屏查看,同时出现删除按钮,点击删除能够删除图片,远端设备同时显示删除; 4. 使用顺序为先在分布式认证页完成设备组网认证(同一局域网下),然后才可以使用远端摄像头和查看远端图片。 ## 工程目录 ```shell entry/src/main/ets/ |---entryability | |---EntryAbility.ets // 应用入口 |---models | |---CameraModel.ts // 相机操作类 | |---ImageFileModel.ts // 图片操作类 | |---RemoteDeviceModel.ts // 远程设备操作类 |---pages | |---CameraPage.ets // 分布式相机页面组件 | |---DeviceMangerPage.ets // 分布式组网认证页面组件 | |---ImagesPage.ets // 分布式图库页面组件 | |---Index.ets // 首页(用Tab组件集中展示以上三个页面) |---utils | |---DistributedAccountHelper.ts // 分布式账号工具类 | |---GlobalThis.ts // 全局变量操作类 | |---Logger.ts // 日志工具类 | |---PerssionUtils.ts // 权限工具类 ``` ## 具体实现 本示例使用 [Tabs容器组件](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-container-tabs.md) 搭建整体应用框架,三个 [TabContent](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-container-tabcontent.md) 分别展示布式组网认证页面,分布式相机页面,分布式图库页 * Index.ets页面,使用`grantPermission`​调用PerssionUtils.ts提供的方法完成权限获取,同时用于这是本应用示例中唯一的page,具有完整的生命周期,下面三个都是组件,缺少`onPageShow()`​ `onPageHide()`​ 等方法,所以其他页面组件例如相机页面,需要在进入后台时释放资源,需要在Index页面操作。 * 布式组网认证页面DeviceMangerPage.ets,该页面驱动RemoteDeviceModel.ts完成相关操作 * 点击开始发现设备`remoteDeviceModel.startDiscovering()`​,会调用`@ohos.distributedDeviceManager`​ 的`startDiscovering(discoverParam, filterOptions)`​ 和`注册发现设备成功回调监听`​ 维护页面的 `trustDeviceList`​ 和 `unTrustDeviceList`​ 。 * 可信设备展示的设备`remoteDeviceModel.getAvailableDeviceList()`​ 和 在线设备展示的设备`remoteDeviceModel.getUnTrustDeviceList()`​,页面点击开始发现设备后,页面会初始化两个定时器间隔固定时间查询最新的`trustDeviceList`​ 和 `unTrustDeviceList`​。 * 点击可信设备展示的设备`remoteDeviceModel.unbindTarget(deviceId)`​和点击在线设备展示的设备`remoteDeviceModel.bindTarget(deviceId)`​ 分别会调用`@ohos.distributedDeviceManager`​ 提供的`unbindTarget()`​ 和 `bindTarget()`​。 * 点击停止发现`remoteDeviceModel.stopDiscovering()`​,会调用`@ohos.distributedDeviceManager`​ 的`stopDiscovering()`​,清除定时器,取消注册监听回调。 * 分布式相机页面CameraPage.ets,该页面驱动CameraModel.ts完成相关操作 * 进入相机页面会进行相机初始化,`CameraService.initCamera(this.surfaceId)`​,包括调用`camera.getCameraManager(this.context)`​获取相机管理器实例,调用`getSupportedCameras()`​获取支持的camera设备,标识`izDistributedCapture`​分布式标志位,调用`getSupportedOutputCapability`​获取相机支持的输出能力,调用`createPreviewOutput`​创建预览输出, 调用`createPhotoOutput`​创建拍照输出流,调用`createCameraInput`​创建相机输入调,调用`open`​打开相机。创建会话,开始会话配置,向会话中添加相机输入流,拍照输出流,预览输出流,提交会话配置,启动会话,调用`setPhotoOutputCb`​设置拍照回调。 * 点击切换按按钮调用`CameraService.getSupportedCamerasString()`​展示目前支持使用的摄像头,选中后重新进入相机初始化。 * 点击拍照会进入`CameraService.takePicture(this.surfaceId)`​,如果时本地摄像头拍照,则进入拍照回调`photoOutput.on(type: 'photoAvailable', callback: AsyncCallback)`​,如果是远端摄像头拍照,则进入分布式拍照`distributedTakePicture(surfaceId)`​。两个拍照方法最终都会将获取的图片buffer传给`saveImage(buffer: ArrayBuffer, img?: image.Image)`​,由该方法保存图片到分布式文件夹并设置图片的分布式数据安全等级为`'s0'`​。 * 分布式图库页ImagesPage.ets,该页面驱动ImageFileModel.ts完成相关操作 * Grid布局,通过`Image`​展示foreach遍历的`files`​。 * 页面初始化时会设置一个定时器`imageTimer`​,间隔固定时间调用`imageFileService.getImageList()`​查询文件列表是否更新,将结果写入`files`​,由于查询的是分布式文件夹,分布式文件系统会自动帮我们同步远端数据。 * 删除时调用`imageFileService.deletePicture()`​,传入此时全屏展示的图片路径。 ## 相关权限 允许不同设备间的数据交换:[ohos.permission.DISTRIBUTED_DATASYNC](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/permissions-for-all.md#ohospermissiondistributed_datasync) 允许应用使用相机:[ohos.permission.CAMERA](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/permissions-for-all.md#ohospermissioncamera) 允许应用访问用户媒体文件中的地理位置信息:[ohos.permission.MEDIA_LOCATION](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/permissions-for-all.md#ohospermissionmedia_location) 允许应用管理系统分布式账号信息:[ohos.permission.MANAGE_DISTRIBUTED_ACCOUNTS](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/permissions-for-system-apps.md#ohospermissionmanage_distributed_accounts) 允许系统应用获取分布式设备的认证组网能力:[ohos.permission.ACCESS_SERVICE_DM](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/permissions-for-system-apps.md#ohospermissionaccess_service_dm) ## 依赖 不涉及。 ## 约束与限制 1. 本示例仅支持标准系统上运行,支持设备:RK3568; 2. 本示例分布式相机功能访问远端摄像头前提是完成分布式组网认证,分布式图库功能访问远端图库前提是登录同一分布式账号完成组网认证,分布式文件安全等级不高于设备安全等级。 3. 本示例为stage模型,已适配API version 11版本SDK,SDK版本号(API Version 11 Release),镜像版本号(4.1.7.8)。 4. 本示例需要使用DevEco Studio 版本号(4.1 Release)才可编译运行。 5. 本示例涉及 ohos.permission.MANAGE\_DISTRIBUTED\_ACCOUNTS和 ohos.permission.ACCESS_SERVICE_DM权限为system\_basic级别,需要配置高权限签名,参考[选择申请权限的方式 (openharmony.cn)](https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/security/AccessToken/determine-application-mode.md); ## 下载 下载代码请复制以下命令到终端执行 ```shell git clone https://gitee.com/MIKECODE/distributeddemo.git ```