开源鸿蒙分布式屏幕开发参考示例
一、简介
分布式屏幕功能早在OpenHarmony-3.1-Release就已经发布,详情可参考[官方仓库的介绍](https://gitee.com/openharmony/distributedhardware_distributed_screen)。
本示例基于OpenHarmony自带的分布式屏幕相关API,并简单实现了屏幕镜像(或扩展)投屏相关应用功能。示例主要分为ArkTS版本和C++版本,ArkTS版本目前主要基于API9版本分布式屏幕功能的API进行开发,API详细说明可参考:[@ohos.screen](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/reference/apis/js-apis-screen.md)。开发者可自行基于API10开发,其中API10版本增加了停止屏幕镜像(或扩展)的API。
二、源码下载
源码详细说明及下载可参考
https://gitee.com/algoideas/DistributedScreen
三、效果预览




使用说明
应用界面中展示可以点击镜像投屏或扩展投屏,为了添加分布式设备,可以在菜单中进入设备管理页面进行添加。此外,开发者可创建虚拟屏幕,在本机预览投屏后的效果(开启虚拟屏幕会增加系统负荷)。
四、工程目录
```
entry/src/main/
|-- ets
| |-- common
| | |-- Constant.ets
| | |-- Logger.ts // 日志工具
| | |-- TitleBar.ets
| |-- entryability
| | |-- EntryAbility.ets
| |-- model
| | |-- RemoteDeviceModel.ets
| |-- pages
| | |-- DeviceManager.ets
| | |-- FilterOption.ets
| | |-- Index.ets // 首页
| | |-- ListDeviceView.ets
| |-- utils
| |-- Permission.ts
...
docs
|-- distributed_screen
| |-- BUILD.gn
| |-- include
| |-- src
| |-- dscreen_expand.cpp // 扩展投屏C++实现
| |-- dscreen_mirror.cpp // 镜像投屏C++实现
```
五、具体实现
1. ArkTS实现
通过在IDE中创建工程,并调用[@ohos.screen](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/reference/apis/js-apis-screen.md)中相关API进行实现,具体可参考工程。
主要使用到[@ohos.screen](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/reference/apis/js-apis-screen.md)中的相关API如下:
| 方法名称 | 描述 |
| -------------------- | ----------------------- |
| screen.getAllScreens | 获取所有的屏幕,可以是本地屏幕和其他设备的屏幕 |
| screen.makeMirror | 将屏幕设置为镜像模式 |
| screen.makeExpand | 将屏幕设置为扩展模式 |
2. C/C++实现
基于分布式屏幕的C/C++相关API实现一个简单的程序,并增加BUILD.gn用于开发者自行编译验证参考。
> 说明:源码及BUILD.gn在OpenHarmony-3.2-Release版本有验证,OpenHarmony-4.x版本,需要修改BUILD.gn
六、相关权限
默认添加以下权限
| 权限名称 | 描述 |
| ------------------------------------ | -------------------------- |
| ohos.permission.CAPTURE_SCREEN | 允许应用截取屏幕图像 |
| ohos.permission.DISTRIBUTED_DATASYNC | 允许不同设备间的数据交换 |
| ohos.permission.GET_BUNDLE_INFO | 允许应用查询其他应用的信息。该权限仅适用于三方应用。 |
| ohos.permission.INTERNET | 允许使用Internet网络 |
> 说明:应用需采用系统签名,部分权限可根据是否使用相关模块进行删除