DEV Community

SameX
SameX

Posted on

HarmonyOS Next自定义数据类型的跨应用协作:实现企业级文档管理

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

概述

企业级文档管理系统需要支持跨应用、跨设备的数据共享与协同工作。通过华为HarmonyOS的统一数据管理框架(UDMF)和方舟数据管理(ArkData),我们可以轻松创建自定义的标准化数据类型,实现文档、图片、音频等数据在不同应用和设备之间的流畅交互。本文将以企业文档管理为例,展示如何创建自定义数据类型,并在多个应用中实现跨设备文档共享和协同编辑。

实战场景

我们将开发一个企业文档管理系统,支持以下功能:

  • 文档、图片和音频文件的自定义标准化数据类型创建。
  • 使用UDMF实现跨应用拖拽与数据共享。
  • 利用分布式对象实现多设备的文档数据同步与协同编辑。

1. 创建自定义的数据类型

HarmonyOS支持开发者创建自定义标准化数据类型,以便处理企业文档、图片和音频等类型数据。首先,我们需要在应用的 utd.json5 文件中定义这些自定义类型。

步骤一:定义文档、图片、音频的自定义数据类型

{
  "UniformDataTypeDeclarations": [
    {
      "TypeId": "com.company.document",
      "BelongingToTypes": ["general.file"],
      "FilenameExtensions": [".docx", ".pdf"],
      "MIMETypes": ["application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/pdf"],
      "Description": "Enterprise Document",
      "ReferenceURL": ""
    },
    {
      "TypeId": "com.company.image",
      "BelongingToTypes": ["general.image"],
      "FilenameExtensions": [".jpg", ".png"],
      "MIMETypes": ["image/jpeg", "image/png"],
      "Description": "Enterprise Image",
      "ReferenceURL": ""
    },
    {
      "TypeId": "com.company.audio",
      "BelongingToTypes": ["general.audio"],
      "FilenameExtensions": [".mp3", ".wav"],
      "MIMETypes": ["audio/mpeg", "audio/wav"],
      "Description": "Enterprise Audio File",
      "ReferenceURL": ""
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

在这个文件中,我们创建了三个自定义数据类型:文档、图片和音频文件,分别对应 .docx.pdf.jpg.mp3 等文件格式。

步骤二:使用自定义数据类型

在应用中,我们将通过ArkData统一数据结构,将自定义数据类型封装到数据对象中,以便在应用间拖拽和共享。

import { uniformDataStruct, uniformTypeDescriptor, unifiedDataChannel } from '@kit.ArkData';

let documentDetails: Record<string, string> = {
  'author': 'John Doe',
  'created_at': '2024-10-01',
};

let document: uniformDataStruct.File = {
  uniformDataType: 'com.company.document',
  filename: 'enterprise_document.docx',
  filePath: '/documents/enterprise_document.docx',
  details: documentDetails,
};

// 创建图片数据
let imageDetails: Record<string, string> = {
  'resolution': '1920x1080',
};

let image: uniformDataStruct.Image = {
  uniformDataType: 'com.company.image',
  url: '/images/enterprise_image.jpg',
  description: 'Enterprise Image',
  details: imageDetails,
};

// 创建音频数据
let audioDetails: Record<string, string> = {
  'duration': '120s',
};

let audio: uniformDataStruct.Audio = {
  uniformDataType: 'com.company.audio',
  url: '/audio/enterprise_audio.mp3',
  description: 'Enterprise Audio File',
  details: audioDetails,
};
Enter fullscreen mode Exit fullscreen mode

通过上述代码,我们将自定义的文档、图片和音频文件封装为标准化数据结构对象。

2. 使用UDMF统一数据结构处理跨应用文档拖拽和共享

接下来,我们实现跨应用文档拖拽与共享功能。UDMF提供了统一的数据结构接口,可以在不同应用之间拖拽数据并共享。

步骤三:实现跨应用拖拽功能

在应用A中,用户可以拖拽企业文档至目标区域:

let unifiedData = new unifiedDataChannel.UnifiedData();
let documentRecord = new unifiedDataChannel.UnifiedRecord(uniformTypeDescriptor.UniformDataType.FILE, document);
let imageRecord = new unifiedDataChannel.UnifiedRecord(uniformTypeDescriptor.UniformDataType.IMAGE, image);
let audioRecord = new unifiedDataChannel.UnifiedRecord(uniformTypeDescriptor.UniformDataType.AUDIO, audio);

unifiedData.addRecord(documentRecord);
unifiedData.addRecord(imageRecord);
unifiedData.addRecord(audioRecord);

// 启动拖拽操作,将数据拖拽到目标应用
unifiedDataChannel.setDragData(unifiedData);
Enter fullscreen mode Exit fullscreen mode

在目标应用B中,我们接收拖拽数据并解析文档、图片和音频文件:

unifiedDataChannel.getDropData().then((data) => {
  let records = data.getRecords();
  records.forEach((record) => {
    let recordType = record.getValue()['uniformDataType'];

    switch (recordType) {
      case 'com.company.document':
        console.log('Document received: ', record.getValue()['filename']);
        break;
      case 'com.company.image':
        console.log('Image received: ', record.getValue()['url']);
        break;
      case 'com.company.audio':
        console.log('Audio received: ', record.getValue()['url']);
        break;
      default:
        console.log('Unknown data type received.');
    }
  });
});
Enter fullscreen mode Exit fullscreen mode

此代码实现了应用间的数据拖拽与接收,能够处理企业文档、图片和音频文件。

3. 实现自定义数据类型的分布式对象管理与跨设备协同工作

为了支持跨设备的数据同步与协作,我们使用分布式数据对象管理自定义数据类型。通过分布式数据对象,用户在设备A上修改的文档将自动同步到设备B上,确保多终端的一致性。

步骤四:创建并同步分布式数据对象

在设备A上,我们将自定义文档作为分布式对象进行同步:

import { distributedDataObject } from '@kit.ArkData';

// 创建分布式数据对象
let sessionId = distributedDataObject.genSessionId();
let distributedDocument = distributedDataObject.create(this.context, document);

// 设置同步的sessionId
distributedDocument.setSessionId(sessionId);

// 监听状态变化
distributedDocument.on('status', (sessionId: string, networkId: string, status: string) => {
  if (status == 'restored') {
    console.log('Document restored on device: ', networkId);
  }
});

// 保存文档到设备B
let targetDeviceId = 'device_B_network_id'; // 目标设备的网络ID
distributedDocument.save(targetDeviceId);
Enter fullscreen mode Exit fullscreen mode

步骤五:在设备B上接收文档并协同编辑

设备B上可以通过监听同步状态,及时获取设备A上的文档修改:

let receivedDocument = distributedDataObject.create(this.context, null);

// 设置相同的sessionId以同步数据
receivedDocument.setSessionId(sessionId);

// 监听文档同步
receivedDocument.on('change', (sessionId: string, fields: Array<string>) => {
  fields.forEach((field) => {
    console.log(`Document field ${field} changed on session ${sessionId}`);
  });
});
Enter fullscreen mode Exit fullscreen mode

此代码确保了跨设备的文档同步和协作,用户可以在多个设备上实时编辑文档,所有修改都会在各设备之间同步。

总结

通过本文,我们展示了如何通过HarmonyOS的方舟数据管理与统一数据管理框架,创建自定义数据类型并在跨应用和跨设备场景中实现数据共享和协作。关键步骤包括:

  1. 创建自定义的标准化数据类型,以便处理文档、图片和音频文件。
  2. 使用UDMF实现跨应用数据拖拽和共享,确保不同应用之间的无缝交互。
  3. 利用分布式数据对象,实现多设备间的数据同步和协同工作。

通过这些技术,我们能够轻松构建企业级文档管理系统,实现多终端之间的协同编辑与数据共享,提升用户体验。

PS:感谢观看,祝大家1024程序员快乐吖~

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay