# pasteboard_entity_extraction **Repository Path**: seiphro/pasteboard_entity_extraction ## Basic Information - **Project Name**: pasteboard_entity_extraction - **Description**: 基于OpenHarmony的剪贴板能力开发的跨设备导航 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-20 - **Last Updated**: 2025-06-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 剪贴板服务开发与应用(C++) ## 1. 任务介绍 ### 剪贴板服务简介 OpenHarmony剪贴板服务,提供支撑应用开发者方便、高效的使用剪贴板相关业务的功能。 ### 本篇Codelab将实现的内容 您将实现以下内容: - 使用剪贴板服务实现手机端复制文本,通知车机开启导航; ### 您将会学到什么 - 新增接口代码将剪贴板接入分布式引擎,代码编译及产物推入设备,并查看最终效果; ## 2. 环境准备 ### 2.1 硬件要求 - 一台高性能PC(建议:内存16G,硬盘500G) - 一台华为手机 - 一台HiCar车载智慧屏 ### 2.2工具下载 - WSL: Ubuntu-18.04及以上版本,X86_64架构 - WSL: 提前下载python2: ``` sudo apt install python2 ``` - Windows: Visual Studio Code 1.100.2 版本 - [WSL安装库和工具集](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-pkg-install-package.md) ### 2.3 工具使用 - [Visual Studio Code远程连接WSL](https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/wsl-vscode) ### 2.4 代码获取 - 创建工作目录 ``` mkdir -p workspace ``` - 创建剪贴板代码目录 ``` cd workspace mkdir -p pasteboard ``` - 下载剪贴板服务源码 ``` cd pasteboard git clone https://gitee.com/seiphro/pasteboard_entity_extraction.git cd pasteboard_entity_extraction ``` ## 3.OpenHarmony剪贴板接口适配 ### 3.1 涉及修改的文件 ``` ./foundation/distributeddatamgr/pasteboard/services/core/src/pasteboard_service.cpp ``` ### 3.2 修改内容 ​ 开源下载的代码已经实现了剪贴板的复制、内容提取、实体识别接口等,你只需要补全**复制与通知**接口即可 - **订阅**接口介绍 **RecognizePasteData**抽取和识别剪贴板内容中的地址信息。当剪贴板检测到地址信息时,通知订阅者,接口定义及参数解释如下: ```cpp /** * Recognize the entity information from paste data. * @param pasteData The data copied in pasteboard expected to be recognized. */ void RecognizePasteData(PasteData &pasteData); ``` **NotifyEntityObservers**剪贴板通知订阅的接口。剪贴板遍历所有订阅,触发回调,entityType在本文中需填**EntityType::ADDRESS**: ```cpp /** * Notify observers with entity information. * @param entity The entity information to notify observers about. * @param entityType The type of entity being notified. * @param dataLength The length of text in PasteData. */ void NotifyEntityObservers(std::string &entity, EntityType entityType, uint32_t dataLength); ``` 接口补全: **SetPasteData**接口为剪贴板在用户触发复制操作时调用的接口,复制成功后剪贴板开始识别内容中的地址信息 ```cpp void PasteboardService::SetPasteData(int fd, int64_t rawDataSize, const std::vector &buffer, const sptr &delayGetter, const sptr &entryGetter) { // 数据处理并构造为PasteData对象 MessageParcelWarp messageData; ... // 调用业务代码存储PasteData对象 auto ret = SaveData(pasteData, delayGetter, entryGetter); // 满足条件则触发地址识别 if (entityObserverMap_.Size() != 0 && pasteData.HasMimeType(MIMETYPE_TEXT_PLAIN)) { // 代码补全 } ... return ERR_OK; } ``` **RecognizePasteData**接口在抽取到地址信息后,需遍历所有订阅者,触发回调 ```cpp void PasteboardService::RecognizePasteData(PasteData &pasteData) { // 抽取PasteData对象中的文本信息 std::string primaryText = GetAllPrimaryText(pasteData); FFRTTask task = [this, primaryText]() { // Process和ExtractEntity方法提取primaryText中的地址实体并赋值给字符串location std::string entity = ""; int32_t result = processor.Process(primaryText, entity); std::string location = ""; int32_t ret = ExtractEntity(entity, location); // 代码补全 ... }; FFRTUtils::SubmitTask(task); } ``` - 修改完成后,./build.sh --product-name rk3568 --ccache --disable-post-build --build-target pasteboard编译代码为so文件,将so文件替换到手机里。 ## 4.恭喜你 ​ 干得漂亮,您已经成功完成了“剪贴板服务开发与应用”并学到了: - 使用Visual Studio Code进行OpenHarmony源码开发; - OpenHarmony剪贴板功能的应用; - OpenHarmony源码的编译及产物推入设备; - 车机感知手机导航信息; ## 5.完整代码 [gitee地址](https://gitee.com/seiphro/pasteboard_entity_extraction)